当属性触发器触发时如何设置视图模型属性

11

我有一个带有视图模型的列表视图。ItemsSource是视图模型中对象的集合。在视图模型上存在一个标志属性IsFlagOn。当ListViewItem检测到IsMouseOver时,我希望将该属性设置为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”。请验证所有者类型是否为样式的 TargetType,或使用“Class.Property”语法指定该属性。

更新(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>

“but this breaks” 会导致什么异常?“IsFlagOn” 是一个依赖属性吗? - Arian Motamedi
错误信息为“未找到DataContext类型”。ViewModel是一个普通的类,实现了INotifyPropertyChanged接口,因此IsFlagOn不是一个依赖属性。 - Mike Caron
@Samir,请查看更新。这是关于ListViewItem的样式。 - Mike Caron
@PoweredByOrange 请查看更新的评论。 - Mike Caron
“IsFlagOn”是属于 VM 还是集合中的每个项的属性?如果它属于 VM,那可能是错误的。使用目标类型为 ListView 的 RelativeSource 绑定来获取正确的范围,这样你就可以找到该属性了。 - Viv
显示剩余3条评论
1个回答

8
这基本就是OneWayToSource绑定模式的作用 - 只需从视图更新视图模型。但是,由于IsMouseOver是只读属性,你将无法这样做(因为 WPF 中存在一个错误):
<Setter Property="IsMouseOver" Value="{Binding Path=IsFlagOn, Mode=OneWayToSource}" />

然而,有一些方法可以绕过这个问题。其中一些方法在这里进行描述:OneWayToSource binding from readonly property in XAML


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接