1

自分がやろうとしていることはできないという恐ろしい気持ちがありますが、これで終わりです。たぶんもっと良い方法があります。

別のファイルに ResourceDictionary があり、UserControl (ビュー) に取り込まれています。

<UserControl.Resources>        
    <ResourceDictionary Source="..\Resources.xaml"/>
</UserControl.Resources>

RD では、いくつかのボタン スタイルを定義します。そのうちの 1 つは条件を含み、"IsCurrentFilter" コンバーターが True を返す場合に前景を赤に設定します。

<Style x:Key="FilterButton" TargetType="Button" BasedOn="{StaticResource ButtonBase}">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Converter={StaticResource IsCurrentFilter}}" Value="True"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Foreground" Value="Red" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

コンバーターは、同じ RD のさらに上に定義されています。

<util:IsCurrentFilterConverter x:Key="IsCurrentFilter" ViewModel="{Binding}"/>

問題は、コンバーターが (比較を行うために必要な) ビュー モデルにアクセスできず、ViewModelプロパティが何もバインドすることを単に拒否することです。エラーは...

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:(no path); DataItem=null; target element is 'IsCurrentFilterConverter' (HashCode=50804710); target property is 'ViewModel' (type 'Object')

...ビジュアルツリーにないことを理解しているので、これはちょっと理にかなっています。

では、この ResourceDictionary 内のビュー モデルにバインドするにはどうすればよいでしょうか?

4

2 に答える 2

2

あなたはそれを間違っています。この方法でコンバーターをビューモデルにバインドしないでください。入力値のみに依存する必要があります。ビューモデルがボタンのデータコンテキストであるか、論理ツリーの予測可能な場所で使用できるようにボタンを設定します。次に、バインディングのコンバーターは、ビューモデルをブール値に「変換」できます。さらに良いことに、目的のブール値を提供するviewmodelプロパティを追加し、代わりにそれにバインドします。

于 2013-02-15T09:22:39.430 に答える
2

誰かがこれに出くわした場合に備えて、問題を解決するために別の手法を選択しました。ただし、リソース内のバインドは、ここで修正されたものです。

http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF

于 2013-03-08T13:44:56.513 に答える