11

我有一个带有视图模型的 ListView。ItemsSource 是 View Model 中对象的集合。视图模型上存在某个标志 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>
4

1 回答 1

8

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

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

不过有一些方法可以绕过它。其中一些在此处进行了描述:OneWayToSource binding from readonly property in XAML

于 2013-08-27T19:44:20.330 回答