1

私は何かに行き詰まっており、簡単な答えを願っています。まず、マルチバインディング トリガーを持つテーマがあります。

<DataTrigger Value="True">
  <DataTrigger.Binding>
    <MultiBinding Converter="{StaticResource MyConverter}" >
      <Binding Path=".TemplatedParent" RelativeSource="{RelativeSource Self}" />
      <Binding Path="IsEnabled" RelativeSource="{RelativeSource Self}" />
    </MultiBinding>
  </DataTrigger.Binding>
  <Setter Property="Background" Value="{StaticResource NewBackgroundColor}" />
  <Setter Property="BorderBrush" Value="{StaticResource NewBorderBrushColor}" />
</DataTrigger>

私のデータ コントロールのテキスト ボックス、コンボ ボックスには INotifyPropertyChanged が実装されています。

処理中、特定の条件下で、「IsEnabled」が変更されたが、実際にはその値が変更されていないというイベントを発生させたい。そのため、マルチバインディングがトリガーされることはありません。コンバーターへの最初のパラメーターはコントロール オブジェクト自体であるため、「変更」されることはありません。そのため、コンバーターへのパラメーターとして操作するためにそこにあるだけです。

実際にトリガーを起動する唯一の方法は、次のようなことをすることです

MyControl.IsEnabled = false;
MyControl.IsEnabled = true;

マルチバインディングデータトリガーを強制的にトリガーする他の方法はありますか?

私の問題についてもう少し詳しく説明してみてください。特定の設定/機能などを追加するために、基本的なコントロール (テキストボックス、コンボボックス、ボタンなど) をサブクラス化しました。それらの共通性のために、それらはすべて「IMyCommonInterface」インターフェイスをサポートします。「テーマ」全体 (単純なテキスト ボックスなど) を再定義する必要なく、データ検証を行うように条件付きで色を変更したいのですが、これらのサンプル プロパティの単純な色の変更だけではありません。

基本的なテキスト ボックスには "IMyCommonInterface" もカスタム プロパティも含まれていないため、実際のコントロール オブジェクトを最初のパラメーターとして受け取るコンバーター クラス "MyConverter" を作成しました。今、カバーター内で、私はできる

if( values[0] is IMyCommonInterface )

次に、インターフェイスに型キャストし、明示的に作成する必要なく、必要な特別な条件をすべてチェックできます..A + BまたはA + Cまたは(A + B NOT C)OR Dなどに基づいて、それぞれ1ダースのトリガーを作成します.

だから、私はたくさんの異なるテーマやたくさんのトリガーなどを持ちたくはありませんでした。私は他の代替案を検討していますが、PropertyChanged イベントをスローするだけではデータ トリガーが強制されないインスタンスに遭遇した場合は、.ネットにはあり、基本的にほとんど何でも指すことができます。

4

1 に答える 1

1

これは単なるアイデアです...

すでに基本的なコントロールをサブクラス化しているためです。さらに別のプロパティを追加してみませんか。bool DependencyProperty (「IsTriggered」と呼びましょう) と、そのプロパティを切り替えるメソッドを追加できます

public void ReEvaluateTrigger()
{
    IsTriggered = !IsTriggered;
}

public static readonly DependencyProperty IsTriggeredProperty =
        DependencyProperty.Register("IsTriggered", typeof(bool), typeof(ButtonEx), new FrameworkPropertyMetadata(false));

public bool IsTriggered
{
    get { return (bool)GetValue(IsTriggeredProperty); }
    set { SetValue(IsTriggeredProperty, value); }
}

次に、必要なときに、どのような条件の下でも、コードで行う必要があるのは、myControl を呼び出すことだけです。

MyControl.ReEvaluateTrigger()

これにより、トリガーが再評価されます。

 ...taken from your code with a change to binding to IsTriggered
 <Binding Path="IsTriggered" RelativeSource="{RelativeSource Self}" />

IsEnabled がトグルするかどうかを確認するためだけに、これを簡単なテストに入れました (簡単なことはわかっていますが、簡単なテストにすぎません)。

<Button Content="push to trigger enabled below" Click="Button_Click"/>
<Sample:ButtonEx x:Name="ButtonToBeTriggered"  IsEnabled="{Binding Path=IsTriggered, RelativeSource={RelativeSource Self}}"
            Content="ButtonToBeTriggered" Width="100" Height="50" Margin="50"/>

//where in code behind
private void Button_Click(object sender, RoutedEventArgs e)
    {
        ButtonToBeTriggered.ReEvaluateTrigger();
    }

テストでは、私は拡張しました

public class ButtonEx : ボタン

ReEvaluateTrigger() とトリガーを作成した場所...とにかく、単なるアイデアです!

于 2012-04-26T21:56:09.200 に答える