Datagrid行IsSelected绑定

时间:2010-08-31 19:55:47

标签: wpf

我希望在我的ViewModel中绑定一个布尔字段,以便在选择datagrid中的行时将其设置为true。

所以我使用了Style技巧。这是在我的主题中使用:

  

然后在Datagrid的XAML标记中: ItemContainerStyle =“{DynamicResource ItemSelection}”

但对我而言,这似乎很糟糕。我不希望在我的样式区域发生属性绑定。有一个更好的方法吗?因为没有某种方法可以直接绑定到行的IsSelected值吗?

3 个答案:

答案 0 :(得分:0)

好吧,我不会说这是“非常糟糕的形式”。我认为没关系。

为简单起见,请考虑使用ListBox。如果你手动添加项目,你最终会得到这样的结果:

<ListBox>
  <ListBoxItem IsSelected="{Binding IsSelectedProperty}">Item1</ListBoxItem>
  <ListBoxItem IsSelected="{Binding IsSelectedProperty}">Item2</ListBoxItem>
  <ListBoxItem IsSelected="{Binding IsSelectedProperty}">Item3</ListBoxItem>
</ListBox>

看起来“好”对吗?您将直接从实际控件(即ListBoxItems)绑定到ViewModel中的属性。这有点回答你的问题。这是绑定IsSelected属性的另一种方法。您必须手动将项目添加到控件中。我不确定你将如何在DataGrid中执行此操作。

现在,如果你要为ListBox指定一个ItemsSource(或者就此而言是一个DataGrid),你有点告诉ListBox为你自动生成ListBoxItems。而且,由于您希望将ListBoxItems的所有的“IsSelected”属性绑定到ViewModel,因此在样式中定义它是完全合理的。

答案 1 :(得分:0)

我同意这项技术很混乱。我编写了一个可能有用的MultiSelectCollectionView类 - 你可以在这里找到它:http://grokys.blogspot.com/2010/07/mvvm-and-multiple-selection-part-iii.html

您可能还想阅读本系列中之前的帖子,以了解Style / IsSelected技术的问题。

答案 2 :(得分:0)

如果您只想在网格中选择行时将viewmodel中的布尔属性设置为true,那么您只需将表示数据源中的模型的第一个属性绑定到网格属性“SelectedItem”

之后,你的布尔属性只需要有一个get,它将你的第一个属性的比较返回给null。

前:

private MyModel __selectedItem;
public MyModel SelectedItem
{
    get {   return _selectedItem; }
    set { 
            if (_selectedItem != value)
            {
                _selectedItem = value;
                RaisePropertyChange("SelectedItem");
            }
        }
 }

 public bool IsItemSelected => SelectedItem != null;