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

本文关键字:属性 设置 视图 模型 触发器 | 更新日期: 2023-09-27 18:29:25

我有一个带有视图模型的ListView。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"。请验证拥有的类型是Style的TargetType,或者使用Class.Property语法指定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>

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

这正是OneWayToSource绑定模式的初衷——能够从视图中更新视图模型。但是,由于IsMouseOver是只读属性,将无法执行此操作(由于WPF中的错误):

<Setter Property="IsMouseOver" Value="{Binding Path=IsFlagOn, Mode=OneWayToSource}" />

不过,还是有办法绕过它的。其中一些描述如下:来自XAML 中只读属性的OneWayToSource绑定