取消选择数据网格 WPF MVVM 中的行(在显示窗口之后)

本文关键字:显示 窗口 之后 数据 选择 数据网 网格 MVVM WPF 取消 | 更新日期: 2023-09-27 18:32:03

>我创建了一个窗口,其中包含一个 DataGrid,该网格绑定到 ObservableCollection:

<GroupBox Header="Kunden" Grid.Column="0">
            <DataGrid AutoGenerateColumns="False"
                          Height="Auto"
                          HorizontalAlignment="Stretch"
                          x:Name="customersDataGrid"
                          VerticalAlignment="Top" Width="Auto"
                          ItemsSource="{Binding Path=Customers, Mode=TwoWay}"
                          IsReadOnly="True"
                          CanUserResizeColumns="False"
                          ClipboardCopyMode="IncludeHeader"
                          CanUserAddRows="False"
                          SelectionMode="Single"
                          ColumnHeaderStyle="{DynamicResource ResourceKey=DataGridColumnHeaderBold}"
                          GridLinesVisibility="None"
                          Background="White"
                          IsSynchronizedWithCurrentItem="True"                              
                          FontFamily="Century Gothic"
                          SelectedItem="{Binding Path=SelectedCustomer,
                                                 Mode=TwoWay,
                                                 UpdateSourceTrigger=PropertyChanged}">
                <!--Trigger-Verhalten-->
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="SelectionChanged">
                        <catel:EventToCommand Command="{Binding CustomerSelectionChangedCmd}"
                                                        DisableAssociatedObjectOnCannotExecute="False"
                                                        PassEventArgsToCommand="True" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Id"
                                        Binding="{Binding Path=CustomerId}"
                                        FontSize="14" Width="Auto" />
                    <DataGridTextColumn Header="Name"
                                        Binding="{Binding Path=CustomerName}"
                                        FontSize="14"  Width="Auto"/>
                </DataGrid.Columns>
            </DataGrid>
        </GroupBox>

Customers=ObservableCollection(客户的属性:CustomerId、CustomerName)

当我在视图模型中将 SelectedCustomer 设置为 null 时,数据网格将被取消选中。但是我需要在窗口启动后保持未选中状态的数据网格。我尝试在视图模型的结构器中设置选定的客户,但它不起作用。只有当我在代码隐藏中执行此操作时,它才有效:customersDatagrid.SelectedItem=null。

是否有任何解决方案以 MVVM 方式执行此操作?

提前感谢和最诚挚的问候,

明市

取消选择数据网格 WPF MVVM 中的行(在显示窗口之后)

嗨,

伙计们非常感谢您的回答,尤其是Geert的建设性提示。删除文件背后的代码后,我可以解决此问题。

为什么?这可能是答案:

在编译期间,将从 XAML 文件创建两个文件:

  1. MainWindow.g.cs – 类 MainWindow 所在的位置。此类加载第二个文件 –

  2. MainWindow.Baml 这是我们经过某种编译后的 XAML(它实际上是预标记化 - 提前解析文件,以便在运行时加载比加载未解析的 XML 文件更快)

这两个文件的加载和连接是在驻留在 MainWindow.g.cs 中的 InitializeComponent 方法中执行的,只有...现在我们已经摆脱了CodeBehind,没有人调用此方法。发生的情况是没有加载 BAML 文件,因此所有内容都保持完全为空。

我从这里得到它:http://www.codeproject.com/Articles/377094/How-to-make-WPF-behave-as-if-MVVM-is-supported-out

我认为 InitializeComponent() 是在构建 ViewModel 之后调用的。这就是为什么我看到 SelectedCustomer 属性在被 vm 构造函数设置为 null 后第二次设置。

我认为视图模型上的 Initialize 方法就是要去的地方。此方法在加载视图时调用,如果默认情况下选择一个项目,则它是取消选择项目的完美方法。

我不建议您绑定网格的SelectedItem

相反,请将其作为命令中的参数发送:

 <i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding CustomerSelectionChangedCmd}"  CommandParameter="{Binding ElementName=customersDataGrid, Path=SelectedItem}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

在视图中,使用所选项目处理命令

    CustomerSelectionChangedCmd= new DelegateCommand<object>(selectedItem => 
    {
        var selected = selectedItem as Customer;
        // Do whatever you want with selected customer ...
    });

并在 XAML 的Grid定义中,将初始选定项设置为 null

 SelectedItem="{x:Null}"

这样,在首次触发 SelectionChanged 事件之前,SelectedItem将为 null。