MVF中的WPF Datagrid selecteditem = null

时间:2011-10-20 08:58:20

标签: wpf binding mvvm datagrid selecteditem

我正在尝试使用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");
            }
        }

提前致谢!

4 个答案:

答案 0 :(得分:5)

我建议检查visual studio中的Output Window,看看是否有任何Binding失败。

您确定选择的是什么时,选择会更新到SelectedUser属性吗?

您是否在SelectedUser的setter中设置了一个断点,并且当您在datagrid上选择某些内容时看到它正在点击?

Binding突破的原因可能很多......

  1. SelectedUser与个人Users的类型不同。
  2. SelectedUserUsers中的任何项目的引用不匹配。
  3. 你如何设置null?
  4. 我的案例中的以下代码完全正常......

        <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

,则可以修改样式