MVF中的WPF Datagrid selecteditem = null

Flo*_*anu 2 wpf binding datagrid selecteditem mvvm

我正在尝试使用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}">
Run Code Online (Sandbox Code Playgroud)

SelectedItem绑定从视图工作到VM,因此在SelectedUser属性中我总是拥有所选对象.问题是在VM中我正在做一些有时将SelectedUser属性更改为null的东西,所以我希望datagrid也取消选择该行.相反,它仍然处于选中状态,如果我尝试单击同一行,则该属性不会更新.如果我单击任何其他行,属性将按预期更改.

有没有办法让datagrid取消选择,如果它的binded属性设置为null?此外,我正在寻找一个MVVM解决方案,因为我不想编写代码.我可以通过编写代码解决这个问题,所以不要浪费时间提供这样的解决方案:)

le:这是我在VM中的属性:

public RPLUser SelectedUser
        {
            get
            {                
                return selectedUser;
            }
            set
            {
                selectedUser = value;
                OnPropertyChanged("SelectedUser");
            }
        }
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Roe*_*elF 5

您是否尝试IsSynchronizedWithCurrentItem="True"在 DataGrid 的 xaml 属性中进行设置?AFAIK,这将允许您通过将 SelectedUser 设置为 null 来取消选择它。
我目前无法对其进行测试,但您也可以尝试将其添加到您的财产的 setter 中:

set
{
    selectedUser = value;
    OnPropertyChanged("SelectedUser");

    ICollectionView collectionView = CollectionViewSource.GetDefaultView(Users);
    collectionView.MoveCurrentTo(selectedUser);

}
Run Code Online (Sandbox Code Playgroud)

(为了ICollectionView做任何事情,你需要IsSynchronizedWithCurrentItem设置)
就像我说的,我现在不能测试这个。此外,属性的 setter 可能不是放置它的最佳位置。也许在PropertyChanged本地为事件创建一个事件处理程序并将该逻辑放在那里。

如果有帮助,请告诉我,否则我会看看是否可以进行简短的测试...


WPF*_*-it 5

我建议检查Output Window视觉工作室,看看是否有任何Binding失败.

你确定当你选择某个东西时,选择会更新到SelectedUser属性中吗?

你是否在setter中设置了一个断点,SelectedUser并且当你在datagrid上选择一些东西时它是否正在击中?

这种Binding打破的原因可能很多......

  1. SelectedUser是个人的不同类型Users.
  2. SelectedUser与参考中的任何项目不匹配Users.
  3. 你如何设置null?

在我的情况下,以下代码完全正常...

    <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>
Run Code Online (Sandbox Code Playgroud)

当我设置MyDGSampleWindow.MySelItem为null时,datagrid属性取消选择.也许您可能需要向我们提供更多关于如何将值实际设置为null的输入.