我正在尝试使用MVVM模式处理数据网格。问题是每当我将绑定到SelectedItem的VM属性更改为null时,View都不会“取消选择”当前选定的项目。这是我在xaml中的绑定:
<DataGrid Grid.Column="0" Grid.Row="0"
ItemsSource="{Binding Path=Users}"
AutoGenerateColumns="False"
CanUserAddRows="False"
IsReadOnly="True"
SelectedItem="{Binding Path=SelectedUser, Mode=TwoWay}">
SelectedItem绑定从视图到VM工作,因此在SelectedUser属性中我总是拥有所选对象。问题是在VM中我正在做一些有时将SelectedUser属性更改为null的东西,所以我希望datagrid也取消选择该行。相反,它仍然处于选中状态,如果我尝试单击同一行,则该属性不会更新。如果我单击任何其他行,则属性会按预期更改。
如果将binded属性设置为null,是否有办法让datagrid取消选择?此外,我正在寻找一个MVVM解决方案,因为我不想编写代码。我可以通过编写代码来解决这个问题,所以不要浪费时间提供这样的解决方案:)
l.e。:这是我在VM中的属性:
public RPLUser SelectedUser
{
get
{
return selectedUser;
}
set
{
selectedUser = value;
OnPropertyChanged("SelectedUser");
}
}
提前致谢!
答案 0 :(得分:5)
我建议检查visual studio中的Output Window
,看看是否有任何Binding
失败。
您确定选择的是什么时,选择会更新到SelectedUser
属性吗?
您是否在SelectedUser
的setter中设置了一个断点,并且当您在datagrid上选择某些内容时看到它正在点击?
Binding
突破的原因可能很多......
SelectedUser
与个人Users
的类型不同。 SelectedUser
与Users
中的任何项目的引用不匹配。我的案例中的以下代码完全正常......
<tk:DataGrid MaxHeight="200" AutoGenerateColumns="False"
ItemsSource="{Binding}"
SelectedItem="{Binding MySelItem,
ElementName=MyDGSampleWindow,
Mode=TwoWay}"
IsReadOnly="True">
<tk:DataGrid.Columns>
<tk:DataGridTextColumn Header="Key"
Binding="{Binding Key,
Mode=OneWay}"/>
<tk:DataGridTextColumn Header="Value"
Binding="{Binding Value,
Mode=OneWay}"/>
</tk:DataGrid.Columns>
</tk:DataGrid>
当我将MyDGSampleWindow.MySelItem
设置为null时,datagrid属性取消选择。也许您可能需要向我们提供更多关于如何将值实际设置为null的输入。
答案 1 :(得分:4)
您是否尝试在DataGrid的xaml属性中设置IsSynchronizedWithCurrentItem="True"
? AFAIK,这将允许您通过将SelectedUser设置为null来取消选择它
我目前无法测试它,但你也可以尝试在你的属性的setter中添加它:
set
{
selectedUser = value;
OnPropertyChanged("SelectedUser");
ICollectionView collectionView = CollectionViewSource.GetDefaultView(Users);
collectionView.MoveCurrentTo(selectedUser);
}
(要ICollectionView
执行任何操作,您需要设置IsSynchronizedWithCurrentItem
)
就像我说的,我现在无法测试。此外,该物业的设定者可能不是最好的地方。也许在本地为PropertyChanged
事件创建一个事件处理程序并将该逻辑放在那里。
让我知道它是否有帮助,否则我会看看我是否可以进行短暂的测试......
答案 2 :(得分:2)
是的,可能需要添加XAML UpdateSourceTrigger来更新UI。
SelectedItem="{Binding SomeProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
答案 3 :(得分:0)
DataGrid不会自动取消选择,因为DataGridRow
的{{1}}属性应设置为IsSelected
。
您可以通过在DataGrid上设置样式来实现这一点..比如
False
<Style x:Key="dataGridRowStyle"
BasedOn="{StaticResource {x:Type WPFToolkit:DataGridRow}}"
TargetType="{x:Type WPFToolkit:DataGridRow}">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected}" />
</Style>
属性应该是对象的属性,即在您的情况下IsSelected
应该具有属性Isselected
然后,在将RPLUser
设置为null之前,只需执行SelectedUser
并且不要忘记将此样式附加到Datagrid中的SelectedUser.IsSelected=False
我正在使用WPFToolkit,如果您要定位DataGridRowStyle