2011-10-20 76 views
2

我正在尝试使用MVVM模式处理数据网格。问题是,无论何时我将绑定到SelectedItem的VM属性更改为null,View都不会“取消”当前选定的项目。这是我在XAML绑定:WPF Datagrid selecteditem = MVVM中的null

<DataGrid Grid.Column="0" Grid.Row="0" 
    ItemsSource="{Binding Path=Users}" 
    AutoGenerateColumns="False" 
    CanUserAddRows="False" 
    IsReadOnly="True" 
    SelectedItem="{Binding Path=SelectedUser, Mode=TwoWay}"> 

的的SelectedItem在SelectedUser财产我总是有选择的对象结合从视图作品到VM这样。问题是在VM中,我正在做一些有时将SelectedUser属性更改为null的东西,因此我期望datagrid也可以取消选择该行。相反,它仍然是选中的,如果我尝试点击同一行,则属性不会更新。如果我点击任何其他行,则属性会按预期更改。

有没有办法让数据网格取消选择,如果它的绑定属性设置为空?另外,我正在寻找MVVM解决方案,因为我不想编写代码。我可以通过编写代码解决这个问题的背后,所以不要浪费时间,提供这样的解决方案:)

l.e:这是我在虚拟机属性:提前

public RPLUser SelectedUser 
     { 
      get 
      {     
       return selectedUser; 
      } 
      set 
      { 
       selectedUser = value; 
       OnPropertyChanged("SelectedUser"); 
      } 
     } 

谢谢!

+1

当您在viewmodel中设置属性时,是否调用OnPropertyChanged事件让视图知道它需要更新? – Purplegoldfish

+0

是的,我正在编辑描述以提及此。好问题,谢谢! –

+0

你可以发布你正在使用的代码来设置虚拟机中的属性以及属性本身的代码吗? – Purplegoldfish

回答

5

我建议检查Output Window在Visual Studio并看看是否有任何Binding失败。

你确定当你选择什么东西,选择更新到SelectedUser属性?

您是否在SelectedUser的setter中放置了一个断点,并在数据网格上选择了某些东西时发现它正在打击?

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> 

当我设置MyDGSampleWindow.MySelItem为空,则DataGrid propertly取消选择。也许你可能需要给我们更多的关于你如何将值设置为null的输入。

+0

你是对的,我没有设置属性为空,因为我应该有。我正在创建一个新的对象,而不是将其设置为null。首先将该属性设置为null,然后为其提供一个新对象来解决此问题。谢谢! –

2

是的,可能需要添加XAML UpdateSourceTrigger来更新UI。

SelectedItem="{Binding SomeProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
+0

这并不能解决问题,对不起。 –

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事件创建事件处理程序并将该逻辑放在那里。

让我知道,如果有帮助,否则我会看看我是否可以运行一个简短的测试...

+0

我有一个类似的问题,并设置'IsSynchronizedWithCurrentItem =“True”'为我工作! – Satfactor

0

数据网格不会自动取消选择它作为DataGridRowIsSelected属性应该设置为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属性应该是IE浏览器在您的情况RPLUser的对象应该有一个属性Isselected

然后你之前将SelectedUser设置为空...只是做SelectedUser.IsSelected=False

不要忘记在Datagrid的这种风格附加到DataGridRowStyle

我使用WPFToolkit你可以修改样式,如果你靶向.NET 4.0

+0

你可以删除BasedOn'BasedOn =“{StaticResource {x:Type WPFToolkit:DataGridRow}}”' – Ankesh

+0

这看起来不是取消选中datagrid行的问题。我刚刚检查过它,在基本设置中,datagrid通过Binding将所选项目设置为null时取消选择。 –

+0

@AngelWPF我试图做它的方式,但它不工作,所以我试着它的风格的方式 – Ankesh