У меня ужасное чувство, что я пытаюсь сделать, не может быть сделано, но здесь идет. Может быть, есть лучший способ.Связывание внутри XAML ResourceDictionary
У меня есть ResourceDictionary в отдельном файле, тянет в UserControl (View):
<UserControl.Resources>
<ResourceDictionary Source="..\Resources.xaml"/>
</UserControl.Resources>
В РД я определить некоторые стили кнопок, одна из которых включает в себя условие, установка переднего плана Красный, если преобразователь "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>
преобразователь определяется в том же РД, дальше:
<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?
Я согласен, она должна только зависеть от его входных значений. Я начал с простого сравнения текущего фильтра с моделью просмотра напрямую, но, очевидно, ConverterParameter не является DependencyProperty. В любом случае, к сожалению, я не могу изменить/управлять DataContext Button, потому что я требую, чтобы это был фильтр для стилизации. – acron
Чтобы продолжить, это предложение фактически просто инвертирует проблему. Теперь у меня есть доступ к ViewModel, но не знаю, на какой фильтр ссылается в конвертере. – acron
Это достаточно просто. У вас есть два варианта: 1) предоставить фильтр ссылку на viewmodel - это часто полезно для многих вещей; 2) сделать многозначный конвертер и пройти как в фильтре, так и в viewmodel (найти его, используя, например, '{RelativeSource FindAncestor}'). –