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

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

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

WPF、DataTriggerのValueにBinding

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

■86336 / inTopicNo.1)  WPF、DataTriggerのValueにBinding
  
□投稿者/ かい (9回)-(2018/01/20(Sat) 00:53:23)

分類:[.NET 全般] 

お世話になっています。
C#及びVisualStudio2017を使用しています。

掲題の通りです。
DataTriggerのValueを可変とすることは可能でしょうか。
Bindingは出来ないようです。
あるいは、他のコントロールで実現出来るでしょうか。
何かご存じであればお教え下さい。

以下はイメージです。
<TextBlock.Style>
    <Style TargetType="TextBlock">
        <Style.Triggers>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsMouseOver" Value="true" />

		    <!--以下のようなことがしたい-->
                    <Condition Property="{Binding Path=Title}" Value="{Binding Path=WindowTitle}" />

                </MultiTrigger.Conditions>
                <Setter Property= "Foreground" Value="Red"/>
                <Setter Property="FontSize" Value="20"/>
            </MultiTrigger>
        </Style.Triggers>
    </Style>
</TextBlock.Style>

引用返信 編集キー/
■86337 / inTopicNo.2)  Re[1]: WPF、DataTriggerのValueにBinding
□投稿者/ Hongliang (603回)-(2018/01/20(Sat) 02:12:58)
2018/01/20(Sat) 02:14:12 編集(投稿者)
まず、Bindingを使うのなら、MultiTriggerではなくMultiDataTriggerを使ってください。
IsMouseOverをBindingで記述する場合、
{Binding Path=IsMouseOver, RelativeSource={RelativeSource Self}}
という記述を使用できます。

Condition.ValueにはBindingを記述できません。
> <Condition Property="{Binding Path=Title}" Value="{Binding Path=WindowTitle}" />
TitleとWindowTitleがどちらも同じオブジェクトにあるプロパティであるなら、
一番簡単なのは、以下のようにVMにプロパティを一つ増やすことです。

class VM : NotifyPropertyChanged {
  private string m_Title, m_WindowTitle;
  public Title {
    get { return this.m_Title; }
    set {
      if (this.m_Title == value) return;
      this.m_Title = value;
      this.OnPropertyChanged(nameof(Title));
      this.OnPropertyChanged(nameof(IsSameTitle));
    }
  }
  public WindowTitle {
    get { return this.m_WindowTitle; }
    set {
      if (this.m_WindowTitle == value) return;
      this.m_WindowTitle = value;
      this.OnPropertyChanged(nameof(WindowTitle));
      this.OnPropertyChanged(nameof(IsSameTitle));
    }
  }
  public bool IsSameTitle {
    get { return this.m_Title == this.m_WindowTitle; }
  }
}

もしTitleとWindowTitleが異なるオブジェクトソースであるなら、
MultiBindingとIMultiValueConverterを使うことになるでしょうか。
https://stackoverflow.com/questions/905932/how-can-i-provide-multiple-conditions-for-data-trigger-in-wpf

引用返信 編集キー/
■86373 / inTopicNo.3)  Re[2]: WPF、DataTriggerのValueにBinding
□投稿者/ かい (10回)-(2018/01/23(Tue) 22:59:22)
返答遅くなり申し訳ございません。

プロパティを増やすという案は思いつきませんでした。ありがとうございます。
重ねて質問させて頂きたいのですが、
提示頂いたソースにおけるIsSameTitleは、
依存関係プロパティとして登録しなければいけないという認識で良いでしょうか。
引用返信 編集キー/
■86374 / inTopicNo.4)  Re[3]: WPF、DataTriggerのValueにBinding
□投稿者/ Hongliang (605回)-(2018/01/23(Tue) 23:25:10)
> 重ねて質問させて頂きたいのですが、
> 提示頂いたソースにおけるIsSameTitleは、
> 依存関係プロパティとして登録しなければいけないという認識で良いでしょうか。

バインドソースがDepencencyObject派生であるなら、そうなりますかね。
私の提示したコードでは、バインドソースであるVMは単なるINotifyPropertyChanged実装オブジェクトなので、IsSameTitleの名前でPropertyChangedイベントを発生させるだけですが。
// 基底クラスにしているNotifyPropertyChangedは、INotifyPropertyChangedの実装を手助けするメンバを持った簡単なクラスを想定しています。
引用返信 編集キー/
■86375 / inTopicNo.5)  Re[4]: WPF、DataTriggerのValueにBinding
□投稿者/ かい (11回)-(2018/01/24(Wed) 00:07:03)
回答ありがとうございます。
実装が完了し、動作を確認出来ました。大変お世話になりました。

解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ