取消选择数据网格 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 方式执行此操作?
提前感谢和最诚挚的问候,
明市
伙计们非常感谢您的回答,尤其是Geert的建设性提示。删除文件背后的代码后,我可以解决此问题。
为什么?这可能是答案:
在编译期间,将从 XAML 文件创建两个文件:
MainWindow.g.cs – 类 MainWindow 所在的位置。此类加载第二个文件 –
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。