2012-07-17 2 views
0

Я хочу, чтобы текст метки рядом с моей ComboBox стал красным, когда ComboBox был в ошибке, но с тем, как я в настоящее время настроил его цвет текста только для обновления начальная нагрузка элемента управления. Как мне добиться подтверждения проверки метки, когда выбор в ComboBox изменился? Или есть другой способ обновить стиль Label?Этикетка для стилизации, основанная на проверке другого элемента управления

У меня есть следующий код XAML:

<Style x:Key="labelStyle" TargetType="Label"> 
    <Setter Property="HorizontalContentAlignment" Value="Left" /> 
    <Setter Property="VerticalContentAlignment" Value="Center" /> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
       <AdornedElementPlaceholder> 
        <Border BorderBrush="Transparent" BorderThickness="0" /> 
       </AdornedElementPlaceholder> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 

    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="Background" Value="White"/> 
      <Setter Property="Foreground" Value="Red"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

<Label Style="{StaticResource labelStyle}" Content="{Binding Path=Label, ValidatesOnDataErrors=True}" /> 

<ComboBox ItemsSource="{Binding Path=ItemList}" SelectedItem="{Binding Path=SelectedItem, ValidatesOnDataErrors=True}"/> 

, а затем в коде:

public string this[string propertyName] 
{ 
    get 
    { 
     if (propertyName == "Label") 
     { 
      if (this.IsRequired && !DelayValidation && SelectedItem == "") 
       return Label + " required"; 
     } 

     return null; 
    } 
} 

ответ

1

С, как вы сделали это вы должны были бы также повысить свойство изменено на свойства «Метка» при изменяется ваше свойство SelectedItem.

Вы можете сделать это без необходимости иметь дополнительные свойства в своей модели/режиме просмотра (или независимо от того, что вы связываете) с решением xaml. Если у вас есть выпадающий как:

<ComboBox Name="comb" ItemsSource="{Binding Strings}" SelectedValue="{Binding Stringy,ValidatesOnDataErrors=True}" /> 

Вы можете сделать ярлык, как:

<Label Content="Select a string"> 
    <Label.Style> 
     <Style TargetType="Label"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=comb,Path=(Validation.HasError)}" Value="True"> 
        <Setter Property="Foreground" Value="Red" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Label.Style> 
</Label> 

Или, если вы хотите это на нескольких элементов управления (или, если вы не хотите, чтобы этот стиль/триггер в явном стиле лейбла) вы могли бы сделать прикрепленную свойство/поведение как:

public class LabelValidationHelper 
{ 
    public static FrameworkElement GetDetailControl(DependencyObject obj) 
    { 
     return (FrameworkElement)obj.GetValue(DetailControlProperty); 
    } 

    public static void SetDetailControl(DependencyObject obj, FrameworkElement value) 
    { 
     obj.SetValue(DetailControlProperty, value); 
    } 

    public static readonly DependencyProperty DetailControlProperty = DependencyProperty.RegisterAttached("DetailControl", typeof(FrameworkElement), typeof(LabelValidationHelper), new UIPropertyMetadata(null, OnDetailControlChanged));  

    private static void OnDetailControlChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) 
    { 
     if (args.NewValue == null) 
      return; 

     var label = (Label)sender; 

     var style = new Style(typeof(Label), label.Style); 

     var binding = new Binding(); 
     binding.Source = args.NewValue; 
     binding.Path = new PropertyPath(Validation.HasErrorProperty); 

     var trigger = new DataTrigger(); 
     trigger.Binding = binding; 
     trigger.Value = true; 

     var setter = new Setter(); 
     setter.Property = Label.ForegroundProperty; 
     setter.Value = Brushes.Red; 

     trigger.Setters.Add(setter); 

     style.Triggers.Add(trigger); 

     label.Style = style; 
    } 

} 

И вы можете использовать его как:

<Label Content="Select a string" example:LabelValidationHelper.DetailControl="{Binding ElementName=comb}" /> 
+0

Работает отлично, спасибо. – rwdial

0

Вы можете сделать это только в стиле.

<Style TargetType="Label"> 
     <Setter Property="FontSize" Value="20"/> 
     <Setter Property="FontWeight" Value="Bold"/> 
     <Setter Property="Padding" Value="0,5"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(Target).(Validation.HasError)}" Value="True"> 
       <Setter Property="Foreground" Value="Red" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(Target).(Validation.HasError)}" Value="False"> 
       <Setter Property="Foreground" Value="Gray" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

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

<Label Target="{Binding ElementName=NominaalBox}" Content="Nominaal (gram):"/> 
<TextBox x:Name="NominaalBox" Text="{Binding Path=NominaalGram, Mode=TwoWay, TargetNullValue='', UpdateSourceTrigger=PropertyChanged}"/>