2013-02-15 2 views
1

У меня ужасное чувство, что я пытаюсь сделать, не может быть сделано, но здесь идет. Может быть, есть лучший способ.Связывание внутри 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?

ответ

2

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

+0

Я согласен, она должна только зависеть от его входных значений. Я начал с простого сравнения текущего фильтра с моделью просмотра напрямую, но, очевидно, ConverterParameter не является DependencyProperty. В любом случае, к сожалению, я не могу изменить/управлять DataContext Button, потому что я требую, чтобы это был фильтр для стилизации. – acron

+0

Чтобы продолжить, это предложение фактически просто инвертирует проблему. Теперь у меня есть доступ к ViewModel, но не знаю, на какой фильтр ссылается в конвертере. – acron

+0

Это достаточно просто. У вас есть два варианта: 1) предоставить фильтр ссылку на viewmodel - это часто полезно для многих вещей; 2) сделать многозначный конвертер и пройти как в фильтре, так и в viewmodel (найти его, используя, например, '{RelativeSource FindAncestor}'). –