2015-07-31 2 views
0

При просмотре кода, который я написал много лет назад, я столкнулся с этим триггером в моей секции стиля WPF. Как можно видеть, я вызываю MultiBinding Converter 7 раз с теми же ссылками на Checkin, Checkout и NotSeen для создания 7 разных цветов. Мне кажется, что это ужасно избыточно и занимает много места. Должен быть лучший способ.Упрощение стиля. Триггеры с mulitibinding в WPF

Есть ли способ сделать это с более коротким стилем? Кроме того, является ли это способом избежать конвертера MultiBinding вообще в рамках MVVM? Вместо этого можно использовать прикрепленное поведение?

ТИА

<Style.Triggers> 
      <!-- if checkout is null, then check for waiting time from the checkin value. Setter action occurs for DataTrigger Value --> 
      <DataTrigger Value="1" > 
       <DataTrigger.Binding> 
        <MultiBinding Converter="{StaticResource WaitStatus}"> 
         <Binding Path="CheckIn" /> 
         <Binding Path="CheckOut" /> 
         <Binding Path="NotSeen" /> 
        </MultiBinding> 
       </DataTrigger.Binding> 
       <Setter Property="Background" Value="{StaticResource VioletBrush}" /> 
      </DataTrigger> 
      <DataTrigger Value="2" > 
       <DataTrigger.Binding> 
        <MultiBinding Converter="{StaticResource WaitStatus}"> 
         <Binding Path="CheckIn" /> 
         <Binding Path="CheckOut" /> 
         <Binding Path="NotSeen" /> 
        </MultiBinding> 
       </DataTrigger.Binding> 
       <Setter Property="Background" Value="{StaticResource BlueBrush}" /> 
      </DataTrigger> 
      <DataTrigger Value="3" > 
       <DataTrigger.Binding> 
        <MultiBinding Converter="{StaticResource WaitStatus}"> 
         <Binding Path="CheckIn" /> 
         <Binding Path="CheckOut" /> 
         <Binding Path="NotSeen" /> 
        </MultiBinding> 
       </DataTrigger.Binding> 
       <Setter Property="Background" Value="{StaticResource TurquoiseBrush}" /> 
      </DataTrigger> 
      <DataTrigger Value="4" > 
       <DataTrigger.Binding> 
        <MultiBinding Converter="{StaticResource WaitStatus}"> 
         <Binding Path="CheckIn" /> 
         <Binding Path="CheckOut" /> 
         <Binding Path="NotSeen" /> 
        </MultiBinding> 
       </DataTrigger.Binding> 
       <Setter Property="Background" Value="{StaticResource GreenBrush}" /> 
      </DataTrigger> 
      <DataTrigger Value="5" > 
       <DataTrigger.Binding> 
        <MultiBinding Converter="{StaticResource WaitStatus}"> 
         <Binding Path="CheckIn" /> 
         <Binding Path="CheckOut" /> 
         <Binding Path="NotSeen" /> 
        </MultiBinding> 
       </DataTrigger.Binding> 
       <Setter Property="Background" Value="{StaticResource YellowBrush}" /> 
      </DataTrigger> 
      <DataTrigger Value="6" > 
       <DataTrigger.Binding> 
        <MultiBinding Converter="{StaticResource WaitStatus}"> 
         <Binding Path="CheckIn" /> 
         <Binding Path="CheckOut" /> 
         <Binding Path="NotSeen" /> 
        </MultiBinding> 
       </DataTrigger.Binding> 
       <Setter Property="Background" Value="{StaticResource OrangeBrush}" /> 
      </DataTrigger> 
      <DataTrigger Value="7" > 
       <DataTrigger.Binding> 
        <MultiBinding Converter="{StaticResource WaitStatus}"> 
         <Binding Path="CheckIn" /> 
         <Binding Path="CheckOut" /> 
         <Binding Path="NotSeen" /> 
        </MultiBinding> 
       </DataTrigger.Binding> 
       <Setter Property="Background" Value="{StaticResource RedBrush}" /> 
      </DataTrigger> 
     </Style.Triggers> 
+1

Почему вы не возвращаете непосредственно кисть вместо int? multibind фон непосредственно на ваш конвертер – nkoniishvt

ответ

1

Первый подход с использованием пользовательского DataTrigger
Создать собственный класс DataTrigger где вы programically определить его связывание, но в коде вы установите сеттер.

class DataTriggerBinding : DataTrigger 
{ 
    public DataTriggerBinding() 
    { 
     SetBinding(); 
    } 

    private void SetBinding() 
    { 
     var multiBinding = new MultiBinding(); 
     multiBinding.Bindings.Add(new Binding("CheckIn")); 
     multiBinding.Bindings.Add(new Binding("CheckOut")); 
     multiBinding.Bindings.Add(new Binding("NotSeen")); 
     multiBinding.Converter = new WaitStatus(); 
     this.Binding = multiBinding; 
    } 
} 

XAML:

<Label Content="{Binding Age}"> 
    <Label.Style> 
     <Style TargetType="Label"> 
      <Style.Triggers> 
       <local:DataTriggerBinding Value="1"> 
        <Setter Property="Foreground" Value="Red"/> 
       </local:DataTriggerBinding> 
      </Style.Triggers> 
     </Style> 
    </Label.Style> 
</Label> 

Последний подход с использованием прикрепленного поведение

class DataTriggerBinding : DependencyObject 
{ 
    public static readonly DependencyProperty IsCustomBindingProperty = DependencyProperty.RegisterAttached(
     "CustomBinding", typeof(bool), typeof(DataTriggerBinding), new PropertyMetadata((x, y) => 
     { 
      SetBinding((DataTrigger)x); 
     })); 

    public static void SetIsCustomBinding(DependencyObject element, bool value) 
    { 
     element.SetValue(IsCustomBindingProperty, value); 
    } 

    public static bool GetIsCustomBinding(DependencyObject element) 
    { 
     return (bool)element.GetValue(IsCustomBindingProperty); 
    } 

    private static void SetBinding(DataTrigger dataTrigger) 
    { 
     var multiBinding = new MultiBinding(); 
     multiBinding.Bindings.Add(new Binding("CheckIn")); 
     multiBinding.Bindings.Add(new Binding("CheckOut")); 
     multiBinding.Bindings.Add(new Binding("NotSeen")); 
     multiBinding.Converter = new WaitStatus(); 
     dataTrigger.Binding = multiBinding; 
    } 
} 

XAML:

<DataTrigger local:DataTriggerBinding.IsCustomBinding="True" Value="1"> 
     <Setter Property="Foreground" Value="Red"/> 
    </DataTrigger> 
+0

Может ли это быть сделано с прикрепленным свойством? –

+0

Я обновил. Взглянуть. – Maximus

+0

Спасибо. Это очень помогает. В качестве второстепенного вопроса я написал прикрепленное свойство, которое находится в datacontext, отличном от viewmodel. Свойство автоматически возвращает Brush. Но я не могу получить значение в сеттер. Что-то вроде: Значение продолжает настаивать на DataContext ListViewItem? –

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