C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

WPF Triggerバインド

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■96802 / inTopicNo.1)  WPF Triggerバインド
  
□投稿者/ yuki (1回)-(2021/02/10(Wed) 21:43:13)

分類:[.NET 全般] 

WPFの質問です。最近WPFの勉強を始めたのですが、どうしてもわからない点があるので、教えてください。
VBの方が慣れているので、VBで書いてます。
System.Windows.Controls.ListViewで、Itemの選択時の色を独自プロパティ(MySelectedBrush)から動的に変更したいのですが、XAMLの記載がわかりません。
「TriggerのSetter Value=〜」の部分はどのように書けばいいでしょうか?

「Value="{Binding Path=MySelectedColor ,RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}"」
のように書いてみましたが、プロパティの設定値が反映されません。

'コード側
    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        ListView1.ItemsSource = listData
        MySelectedBrush = New SolidColorBrush(Colors.Red)
        Me.DataContext = Me
    End Sub
    Public Property MySelectedBrush As Brush

'XAML側
    <Window.Resources>
        <Style TargetType="ListViewItem">
            <Style.Triggers>
                <Trigger Property= "IsSelected" Value="True">
                    <Setter Property="Background" Value= ★ここがわからない★ />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

引用返信 編集キー/
■96803 / inTopicNo.2)  Re[1]: WPF Triggerバインド
□投稿者/ Hongliang (1150回)-(2021/02/10(Wed) 22:13:50)
Bindingのソース(データ側。設定先のプロパティ側をターゲットといいます)は、特に指定しない場合、その要素のDataContextプロパティが使用されます。それ以外のソースを使用したい場合にRelativeSourceとかElementNameとかを指定します。
今回の場合、WindowのDataContextにSolidColorBrushを設定しているので、ソースはDataContextを使用すればよく、明示的にソースを設定する必要はありません。
それから、ソースとなっているオブジェクトからプロパティをたどって目的のオブジェクトにたどり着くためにPathを設定しますが、これも今回はDataContextのオブジェクトそのものが目的のオブジェクトなので、こも不要です。
ということで、今回必要なBindingマークアップ拡張は以下のようになります。

Value="{Binding}"

一般的には、直接DataContextにSolidColorBrushなどを設定するのではなく、ViewModelとなるクラスを定義してWindowのDataContextに設定し、そのプロパティとしてブラシを公開する形になります(もちろん、画面に必要な様々なプロパティも一緒に)。
実行中に変更させる場合、ViewModelにINotifyPropertyChangedを実装させ、そのPropertyChangedイベントを発生させて変更を通知する必要があります。
引用返信 編集キー/
■96804 / inTopicNo.3)  Re[2]: WPF Triggerバインド
□投稿者/ Hongliang (1151回)-(2021/02/10(Wed) 22:24:41)
と書いてから気付いたのですが、ターゲットはListViewItemなんですね。
コレクション要素がある場合、DataContextはそのまま継承はされないため先ほどのでは実現できませんでした。

今回の場合、以下のいずれかが手軽でしょう。
1. ElementNameでソースとなる要素を指定する
2. RelativeSourceでソースとなる要素を検索させる

1の場合、まずWindowに名前を付けます。
<Window x:Name="tekitou" ...
それからBindingマークアップ拡張には以下のように記述します。
{Binding ElementName=tekitou, Path=DataContext}

2の場合は以下のマークアップ拡張になります。
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext}

ElementNameやRelativeSourceでまずWindowをソースと指定し、PathでそのDataContextプロパティを使え、ということになります。
引用返信 編集キー/
■96805 / inTopicNo.4)  Re[3]: WPF Triggerバインド
□投稿者/ yuki (2回)-(2021/02/11(Thu) 00:00:29)
No96804 (Hongliang さん) に返信

ありがとうございます。
AncestorTypeをWindowとすることで、希望動作になりました。
只、PathはDataContextプロパティではダメでMySelectedBrushを指定しないとダメでした。
3日、悩んだので...感謝です。

     <Setter Property="Background"
          Value="{Binding Path=MySelectedBrush ,RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/>


> 一般的には、直接DataContextにSolidColorBrushなどを設定するのではなく、ViewModelとなる
>クラスを定義してWindowのDataContextに設定し、そのプロパティとしてブラシを公開する形になります

最終的にWPFでUserControlとして実装、DLL化してWinFormから参照しての使用を想定しています。
よって、実験としてWindowクラスに直接、Publicなプロパティとして公開しました。


WPFは、学習し始めで、あまりよく理解しておりませんが、WinFormよりリッチなコントロールが
XAMLで結構簡単な記述で作成できるので、それを慣れ親しんだWinFormで利用できたらというのが
私の考えです。このような、使い方をされる方は多分、少数派だと思いますが、何か問題点等あれば
アドバイス頂ければ、幸いです。
(私が試した限りはWPF側でUserControlに配置したListViewを公開プロパティとしたが
WinForm側ではNothingとなり取得できませんでした。(WPFではウインドウハンドルを持たない為??))
WinFormからは、以下のような使用を想定しております。

            Dim wpfListView1 As New WpfControlLibrary1.UserControl1
            wpfListView1.MySelectedBrush = New Windows.Media.SolidColorBrush(Windows.Media.Colors.Red)
            Me.ElementHost1.Child = wpfListView1



引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ