2014-09-11 4 views
0

У меня есть следующий стиль, определенный в моем XAML, чтобы включить кнопки только тогда, когда что-то в DataContext имеет измененные (IsDirty = TRUE):WPF DataTrigger, который принимает параметр?

<!-- Style for Buttons to enable based on IsDirty value --> 
    <Style x:Key="EnableWhenDirtyButtonStyle" TargetType="{x:Type Button}" 
      BasedOn="{StaticResource ButtonStyle}"> 
     <Setter Property="IsEnabled" Value="False" /> 
     <Style.Triggers> 
      <!-- Enable button when something has changed --> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
              AncestorType={x:Type UserControl}}, Path=DataContext.IsDirty}" Value="True"> 
       <Setter Property="Button.IsEnabled" Value="true" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

Это работает до тех пор, пока существует только один DataContext в UserControl. Теперь у меня есть ситуация, когда у меня есть 3 разных DataViews, поэтому у меня есть 3 разных значения IsDirty (т. Е. CustomerTableIsDirty, OrderTableIsDirty, OrderDetailTableIsDirty). В этом случае я могу создать три новых * DisableWhenDirtyButtonStyle в UserControl, как:

 <Style x:Key="CustomerTableEnableWhenDirtyButtonStyle" 
       TargetType="{x:Type Button}" 
       BasedOn="{StaticResource ButtonStyle}"> 
      <Setter Property="Button.IsEnabled" Value="False" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=CustomerTableIsDirty}" Value="true"> 
        <Setter Property="Button.IsEnabled" Value="True" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 

Есть ли способ, чтобы создать DataTrigger такое, что связывание значение может быть передано в стиль в качестве параметра?

В качестве альтернативы, есть способ добавить условия к MultiDataTrigger при наследовании стиля с помощью функции «BasedOn», которая уже определила бы MultiDataTrigger. Например:

<Style x:Key="CustomerTableEnableWhenDirtyButtonStyle" 
        TargetType="{x:Type Button}" 
        BasedOn="{StaticResource EnableWhenDirtyButtonStyle}"> 

    <!-- Add the following to existing MultiDataTrigger in EnableWhenDirtyButtonStyle --> 
    <Condition Binding="{Binding Path=CustomerTableIsDirty}" Value="true" /> 

</Style> 

Я не могу использовать MultiBinding, как этот стиль является частью базового проекта, который привыкает несколькими другими проектами (как DLL). Пользователи этой DLL не смогут обновить стиль, чтобы включить необходимый путь привязки.

+0

Как насчет создания прикрепленного поведения? Что-то вроде описанного здесь (http://www.thomaslevesque.com/2011/10/01/wpf-creating-parameterized-styles-with-attached-properties/). –

ответ

0

Вместо использования 3 разных имен просто используйте одно имя IsDirty.

+0

Поскольку все это на одном UserControl значения CustomerTableIsDirty, OrderTableIsDirty, OrderDetailTableIsDirty находятся в одной ViewModel. Именование их просто «IsDirty» не является вариантом. Я не упоминал об этом в своем сообщении, но каждая таблица имеет свою собственную кнопку сохранения, и я пытаюсь включить только конкретную кнопку. – BrianKE

Смежные вопросы