datagrid的SelectionChanged事件未以mvvm方式触发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了datagrid的SelectionChanged事件未以mvvm方式触发相关的知识,希望对你有一定的参考价值。

//我有一个嵌套的数据网格,我需要在内部网格行选择更改时触发事件。

<DataGrid ScrollViewer.CanContentScroll="True"
                              ScrollViewer.HorizontalScrollBarVisibility="Auto"                          
                              HeadersVisibility="Row"
                              Height="{Binding ElementName=itemsgrid,Path=ActualHeight}"
                              Grid.Row="1"
                              RowDetailsVisibilityMode="Visible"
                              CanUserAddRows="false"
                              VerticalAlignment="Top"
                              AutoGenerateColumns="False"
                              SelectedItem="{Binding SelectedBasketItem}"
                              ItemsSource="{Binding SelectedOrderBasketItems}"
                              CanUserDeleteRows="True">
                        <DataGrid.RowDetailsTemplate>
                            <DataTemplate>
                                <DataGrid ScrollViewer.CanContentScroll="True"
                                          ScrollViewer.HorizontalScrollBarVisibility="Auto"
                                          HorizontalAlignment="Stretch"
                                          HorizontalContentAlignment="Stretch"
                                          CanUserAddRows="false"
                                          HeadersVisibility="Row"
                                          AutoGenerateColumns="False"
                                          ItemsSource="{Binding SelectedBasketItems}"
                                          SelectedValue="{Binding SelectedBasketItemValue}"
                                          SelectedIndex="{Binding SelectedOrderItemIndex}"
                                          SelectedItem="{Binding SelectedSpecificItemInBasket, Mode=TwoWay}"

                                          DataGrid.SelectionMode="Single"
                                          Style="{StaticResource GridItemsControlStyle}"
                                          ctrls:DragDrop.DropHandler="{Binding DropHandler}">

                           <i:Interaction.Triggers>
                                <i:EventTrigger EventName="SelectionChanged">
                                    <i:InvokeCommandAction Command="{Binding DataContext.DgSelectionChangedCommand, 
                                                RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                                           CommandParameter="{Binding}" />
                                </i:EventTrigger>
                            </i:Interaction.Triggers>

                                    <DataGrid.Columns>
                                        <DataGridTextColumn IsReadOnly="True"
                                                            Binding="{Binding Path=ItemName}"
                                                            Width="195">                                        
                                        </DataGridTextColumn>

                                        <DataGridTemplateColumn>
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <Label Content="{Binding Path=RulesCount}"
                                                           Background="{Binding Path=RulesCount ,Converter={StaticResource ItemColourConverter}}" />
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>

                                        <DataGridTemplateColumn Width="115">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <Label Content="{Binding Path=LinkedOrderCount}"
                                                           Background="{Binding Path=LinkedOrderCount ,Converter={StaticResource ItemColourConverter}}" />

                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>

                                        <DataGridTemplateColumn Width="55">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <Label Content="{Binding Path=SDICount}">
                                                        <Label.Background>
                                                            <MultiBinding Converter="{StaticResource SdiItemColourConverter}">
                                                                <Binding ElementName="SDIMaxCnt"
                                                                         Path="Value" />
                                                                <Binding Path="SDICount" />
                                                            </MultiBinding>
                                                        </Label.Background>
                                                    </Label>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </DataTemplate>
                        </DataGrid.RowDetailsTemplate>

// ViewModel中的My Delegate Command初始化

protected override void InitializeCommands()
        {

            DgSelectionChangedCommand= new DelegateCommand<object>(DGSelectionChanged);

        }

//触发选择更改事件时要调用的视图模型中的我的方法

    void DGSelectionChanged(object obj)
    {
        //Logic
    }

当我在代码中使用相同的事件时,事件被触发。我试图使用交互触发器以mvvm方式实现相同。不确定我错过了什么。非常感谢任何帮助。

答案

AncestorLevelRelativeSource设置为2

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding DataContext.DgSelectionChangedCommand, 
                    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}, AncestorLevel=2}}" 
                                   CommandParameter="{Binding}" />
    </i:EventTrigger>
</i:Interaction.Triggers>
另一答案

Autopostback是一种机制,通过该机制,页面将根据Web控件中的某些事件自动发回服务器。在某些Web控件中,该属性称为自动回发。

如果设置为true,则在控件中发生事件时将请求发送到服务器。

的AutoPostBack =真;

请仔细阅读以下链接:Difference between AutoPostBack=True and AutoPostBack=False?

以上是关于datagrid的SelectionChanged事件未以mvvm方式触发的主要内容,如果未能解决你的问题,请参考以下文章

datagrid的SelectionChanged事件未以mvvm方式触发

WPF MVVM ComboBox(in DataGrid)触发事件SelectionChanged, 通知到ViewModel.

请问WPF DataGrid SelectionChanged事件中怎么获取行啊?dataGridRow.Background好像只有获取行后才设置

从MVVM WPF项目中的DataGrid中选择多个项目

wpf datagrid 的单击事件是那个?

停止Datagrid默认选择第一行