2015-07-23 2 views
2

Если свойство IsEnabled истинно, мне нужно установить атрибут Style, иначе он не должен быть установлен. В примерах, которые я видел до сих пор, свойства стиля заданы, но не атрибут стиля. Ниже код не работает с помощью триггеров.Как установить свойство стиля элемента в WPF

<TabItem.Style> 
          <Style TargetType="TabItem"> 
           <Style.Triggers> 
            <DataTrigger Binding="{Binding IsEnabled}" Value="True"> 
             <Setter Property="Style" Value="DotcomTabItemStyle" /> 
            </DataTrigger> 
           </Style.Triggers> 
          </Style> 
         </TabItem.Style> 

ответ

3

Поскольку вы устанавливаете триггер через стиль, изменяя стиль также удалить триггер ... Не совсем уверен, если это будет работать: P

Во всяком случае, вы делаете ошибка на вашем Setter (установка имени ресурса напрямую, а не через статическую или динамическую ссылку на ресурс). И вам не нужен DataTrigger. Оно должно быть:

<Trigger Property="IsEnabled" Value="True"> 
    <Setter Property="Style" Value="{StaticResource DotcomTabItemStyle}" /> 
</Trigger> 

Но, как я уже сказал, это не вероятно, будет работать, как задумано, так как вы пытаетесь изменить свойство Style внутри текущего стиля ...

Один из способов или другой, вы добавите разные Setters для каждого свойства, возможно, либо изменив стиль DotcomTabItemStyle, который у вас уже есть, либо создайте новый (на основе этого, может быть).

EDIT - Или вы можете использовать конвертер и привязать свойство Style к свойству IsEnabled.

Я создал многоразовый конвертер для всех такого рода ситуациях:

public class ConditionalSetterConverter : IValueConverter 
{ 
    public bool Inverse { get; set; } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool flag = (bool)value; 

     if (flag^Inverse) 
      return parameter; 
     else 
      return Binding.DoNothing; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Вы использовать его как это:

<Window> 
    <Window.Resources> 
     <converters:ConditionalSetterConverter x:Key="InverseConditionalSetterConverter" 
               Inverse="True" /> 
     <Style x:Key="DotcomTabItemStyle" TargetType="TabItem">...</Style> 
    </Window.Resources> 

    <TabControl> 
     <TabItem Style="{Binding IsEnabled, 
           RelativeSource={RelativeSource Mode=Self}, 
           Converter={StaticResource InverseConditionalSetterConverter}, 
           ConverterParameter={StaticResource DotcomTabItemStyle}}" /> 
    </TabControl> 
</Window> 

EDIT 2 - ИЛИ ... Вы можете использовать селектор стиля. ItemsControls как TabControl имеют свойство под названием ItemContainerStyleSelector, типа StyleSelector.

Вам необходимо создать свой собственный класс, наследующий StyleSelector, и переопределить функцию SelectStyle, чтобы включить в нее свою собственную логику.

Что-то вроде этого:

public class DotcomTabItemStyleEnabledSelector : StyleSelector 
{ 
    private Style style = null; 

    public override System.Windows.Style SelectStyle(object item, System.Windows.DependencyObject container) 
    { 
     var tabItem = container as TabItem; 

     if (tabItem != null && tabItem.IsEnabled) 
     { 
      if (style == null) 
       style = textBox.TryFindResource("DotcomTabItemStyle") as Style; 

      return style; 
     } 

     return null; 
    } 
} 

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

+0

Да! Я понял, что устанавливаю свойство Style внутри себя, и он работает не так, как ожидалось. Я попытался создать конвертер и установить свойство style, основанное на свойстве IsEnabled. Если IsEnabled имеет значение false, возвращается значение null. В этом случае я хочу, чтобы TabItem имел стиль по умолчанию (который не имеет ключа). Вы знаете, как это сделать. – Sunny

+0

Уверен :) Я добавлю код для конвертера, который может делать то, что вы просите. – almulo

+0

Отредактировано для добавления третьего варианта: Селекторы стиля. – almulo

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