4

私のWPFコントロールには、次の2つのトリガーがあります。

<Trigger
  Property="Controls:TreeViewExItem.IsMouseOver"
  Value="True"
  SourceName="ElementGrid">

<DataTrigger
  Binding="{Binding
    RelativeSource={RelativeSource AncestorType={x:Type Controls:TreeViewEx}},
    Path=HoverHighlighting}"
  Value="False">

どちらも問題なく動作します。しかし、私はこれらの組み合わせが必要です。私はこれを試しました:

<MultiDataTrigger>
  <MultiDataTrigger.Conditions>
    <Condition
      Binding="{Binding
        RelativeSource={RelativeSource AncestorType={x:Type Controls:TreeViewEx}},
        Path=HoverHighlighting}"
      Value="True"/>
    <Condition
      Binding="{Binding
        (Controls:TreeViewExItem.IsMouseOver),
        Source=ElementGrid}"
      Value="True"/>
  </MultiDataTrigger.Conditions>

しかし、それは何もしません。出力ウィンドウに次のメッセージが表示されます。

System.Windows.Dataエラー:17:''(タイプ'String')から'IsMouseOver'値(タイプ'ブール値')を取得できません。BindingExpression:Path =(0); DataItem ='String'(HashCode = 1047858601); ターゲット要素は'TreeViewExItem'(Name ='');です。ターゲットプロパティは'NoTarget'(タイプ'Object')です。InvalidCastException:'System.InvalidCastException:Das Objekt des Typs "System.String" kann nicht in Typ "System.Windows.DependencyObject"umgewandeltwerden。

それは私に何も教えてくれません。それはどのように機能しますか?

更新:完全なプロジェクトコードがGitHubリポジトリで確認できるようになりました。MultiDataTriggerの私の当て推量は、現在にあります

4

2 に答える 2

2

私は今、多くのことを試しましたが、うまくいくものは何も見つかりませんでした. 誰かが私が間違っていることを証明するまで、トリガーとデータトリガーを組み合わせることはできないと想定しなければなりません。

私の解決策は別のものです。同じトリガー (異なるトリガー タイプが必要) からローカル プロパティと親要素のプロパティにアクセスしようとする代わりに、別の DependencyProperty を子要素クラスに追加し、その値を親要素のプロパティにバインドしました。したがって、子要素は親要素の値を見つける必要はありません。値自体の現在のコピーが常に存在します。その値のコピーは別の場所で行われるため、トリガーは適切かつ小さく保たれます。:-)

追加した XAML コードは次のようになります。子アイテムのスタイルの新しいセッターは次のとおりです。

<!-- Pass on the TreeViewEx' HoverHighlighting value to each item
  because we couldn't access it otherwise in the triggers -->
<Setter
  Property="HoverHighlighting"
  Value="{Binding (Controls:TreeViewEx.HoverHighlighting),
    RelativeSource={RelativeSource
      AncestorType={x:Type Controls:TreeViewEx}}}" />

そしてこれは、他のすべてのトリガーがすでに存在するトリガーセクションにあります。

<!-- Set the border and background when the mouse is located over
  the item and HoverHighlighting is active -->
<MultiTrigger>
  <MultiTrigger.Conditions>
    <Condition
      Property="Controls:TreeViewExItem.HoverHighlighting" Value="True"/>
    <Condition
      Property="Controls:TreeViewExItem.IsMouseOver" Value="True"
      SourceName="ElementGrid"/>
  </MultiTrigger.Conditions>

依存関係のプロパティとデータ バインディングは、機能するようになれば素晴らしいものです。しかし、それまではひどいものになる可能性があります。

于 2012-07-28T13:20:40.167 に答える