11

View Model を持つ ListView があります。ItemsSource は、View Model 内のオブジェクトのコレクションです。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' を解決できません。所有する型がスタイルの 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>
4

1 に答える 1

8

これは、OneWayToSourceバインディング モードが作成された目的とほぼ同じです。つまり、ビューからビュー モデルを更新するだけです。ただし、IsMouseOverは読み取り専用プロパティであるため、これを行うことはできません(WPF のバグのため)。

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

ただし、それを回避する方法はあります。それらのいくつかはここで説明されています: XAML の読み取り専用プロパティからの OneWayToSource バインディング

于 2013-08-27T19:44:20.330 に答える