Связывание внутри XAML ResourceDictionary

У меня ужасное чувство, что то, что я пытаюсь сделать, не может быть сделано, но здесь идет. Может быть, есть лучший способ.

У меня есть ResourceDictionary в отдельном файле, будучи вытянутым в UserControl (View):

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

В RD я определяю несколько стилей кнопок, один из которых включает Условие, устанавливая передний план на Красный, если конвертер 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?

2 ответа

Решение

Ты делаешь это неправильно. Таким образом, конвертер не должен быть привязан к модели представления. Он должен зависеть исключительно от его входных значений. Настройте свою кнопку таким образом, чтобы модель представления была контекстом данных кнопки или была доступна в предсказуемом месте вверх по логическому дереву. Затем преобразователь вашей привязки может "преобразовать" модель представления в логическое значение. Более того, добавьте свойство viewmodel, обеспечивающее желаемое логическое значение, и связывайте его с ним.

На всякий случай, если кто-нибудь наткнется на это, я выбрал другую технику для решения проблемы. Однако привязка внутри ресурса - это то, что здесь исправлено:

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

Другие вопросы по тегам