Связывание внутри 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