0

ComboBox がエラーになったときに、ComboBox の横にある Label のテキストを赤くしたいと思いますが、現在の設定方法では、コントロールの初期ロード時にのみ Label のテキストの色が更新されます。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;
    }
}
4

2 に答える 2

2

これを行った方法では、「SelectedItem」プロパティが変更されるたびに、「Label」プロパティで変更されたプロパティも発生させる必要があります。

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}" />
于 2012-07-17T23:08:53.323 に答える
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}"/>
于 2016-04-28T07:28:19.943 に答える