我希望在我的ViewModel中绑定一个布尔字段,以便在选择datagrid中的行时将其设置为true。
所以我使用了Style技巧。这是在我的主题中使用:
然后在Datagrid的XAML标记中: ItemContainerStyle =“{DynamicResource ItemSelection}”
但对我而言,这似乎很糟糕。我不希望在我的样式区域发生属性绑定。有一个更好的方法吗?因为没有某种方法可以直接绑定到行的IsSelected值吗?
答案 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;