我有一个带View Model的ListView。 ItemsSource是View Model中的对象集合。视图模型中存在一些属性IsFlagOn。当ListViewItem检测到IsMouseOver时,我想在View Model中将该属性设置为True。然后将其他UI元素绑定到同一属性,以便在切换MouseOver时更改视图。
我如何在XAML中完成此任务?
我会想象这样的事情(但这会打破):
<Style> <!-- on the ListViewItem -->
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="DataContext.IsFlagOn" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
更新:
错误是
无法解析样式属性'IsFlagOn'。验证拥有类型是Style的TargetType,或使用Class.Property语法指定属性。
UPDATE(2):
这里有一些现有的XAML(以下)。您可以看到ListView绑定了VM的属性AllItems
。需要注意的是,列表中的每个项目都是一个VM,每个列都绑定在一起。 ItemContainerStyle绑定到ListView VM还是Item VM?
<ListView Itemssource="{Binding AllItems}">
<ListView.ItemContainerStyle>
<Style> <!-- on the ListViewItem -->
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="DataContext.IsFlagOn" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<!-- ... -->
</GridView>
</ListView.View>
</ListView>
答案 0 :(得分:8)
这几乎是OneWayToSource
绑定模式的作用 - 只能从视图中更新视图模型。但是,由于IsMouseOver
是只读属性,因此不会能够执行此操作(由于WPF中的错误):
<Setter Property="IsMouseOver" Value="{Binding Path=IsFlagOn, Mode=OneWayToSource}" />
有很多方法可以绕过它。其中一些描述如下:OneWayToSource binding from readonly property in XAML