0

所以我正在尝试学习如何将样式更改动态应用于控件。我无法让用户控件根据主窗口中的单选按钮和用户控件的文本属性来更改其边框和背景。仅仅基于用户控件的文本属性似乎确实有效。所以看起来我在获取单选按钮的 isCheck 属性时做错了。

我已经从原始代码中简化了,但这仍然显示了问题。

主窗口.xaml

    <Window x:Class="UserControlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:UserControlTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <RadioButton x:Name="calcPace" TabIndex="1" Content="Pace" HorizontalAlignment="Left" Margin="34,50,0,0" VerticalAlignment="Top" GroupName="CalculationType"
                     Height="16" Width="41"/>
        <RadioButton x:Name="calcDistance" TabIndex="2" Content="Distance" HorizontalAlignment="Left" Margin="80,50,0,0" VerticalAlignment="Top" GroupName="CalculationType"
                     Height="16" Width="61"/>
        <RadioButton x:Name="calcTime" TabIndex="3" Content="Time" HorizontalAlignment="Left" Margin="146,50,0,0" VerticalAlignment="Top" GroupName="CalculationType"
                     Height="16" Width="42"/>
        <local:TextBoxTime/>
    </Grid>
</Window>

TextBoxTime.xaml(用户控件):

<UserControl x:Class="UserControlTest.TextBoxTime"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:UserControlTest"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <TextBox x:Name="timeString" TabIndex="4" HorizontalAlignment="Left" Height="23" Margin="68,130,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
        <TextBox.Style>
            <Style TargetType="TextBox">
                <Setter Property="BorderBrush" Value="PaleGreen"/>
                <Setter Property="Background" Value="White"/>
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding ElementName=calcTime, Path=IsChecked}" Value="False"/>
                            <Condition Binding="{Binding ElementName=timeString, Path=Text}" Value=""/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="BorderBrush" Value="Red"/>
                        <Setter Property="Background" Value="Snow"/>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>
</Grid>

目前我没有添加任何代码。

谢谢

4

1 回答 1

1

这是我可以做到的:

public partial class RequireableTextBox : UserControl
{
    public RequireableTextBox()
    {
        InitializeComponent();
    }

    #region IsRequired Property
    public bool IsRequired
    {
        get { return (bool)GetValue(IsRequiredProperty); }
        set { SetValue(IsRequiredProperty, value); }
    }

    public static readonly DependencyProperty IsRequiredProperty =
        DependencyProperty.Register(nameof(IsRequired), typeof(bool), typeof(RequireableTextBox),
            new PropertyMetadata(false));
    #endregion IsRequired Property

    #region Text Property
    public String Text
    {
        get { return (String)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register(nameof(Text), typeof(String), typeof(RequireableTextBox),
            //  Default must be "" not null, for the trigger to understand
            new PropertyMetadata(""));
    #endregion Text Property
}

XAML

<UserControl 
    x:Class="UserControlTest.RequireableTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:UserControlTest"
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="300"
    IsTabStop="False"
    >
    <Grid>
        <TextBox 
            x:Name="timeString" 
            HorizontalAlignment="Left" 
            TextWrapping="Wrap" 
            VerticalAlignment="Top" 
            Width="120"
            Text="{Binding Text, RelativeSource={RelativeSource AncestorType=UserControl}, UpdateSourceTrigger=PropertyChanged}"
            >
            <TextBox.Style>
                <Style TargetType="TextBox">
                    <Setter Property="BorderBrush" Value="PaleGreen"/>
                    <Setter Property="Background" Value="White"/>

                    <Style.Triggers>
                        <!-- 
                        Seemed right to disable when unneeded; delete this trigger 
                        if you'd rather not.
                        -->
                        <DataTrigger 
                            Binding="{Binding IsRequired, RelativeSource={RelativeSource AncestorType=UserControl}}"
                            Value="False"
                            >
                            <Setter Property="IsEnabled" Value="False" />
                        </DataTrigger>

                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition 
                                    Binding="{Binding IsRequired, RelativeSource={RelativeSource AncestorType=UserControl}}" 
                                    Value="True"
                                    />
                                <Condition 
                                    Binding="{Binding Text, RelativeSource={RelativeSource AncestorType=UserControl}}" 
                                    Value=""
                                    />
                            </MultiDataTrigger.Conditions>
                            <Setter Property="BorderBrush" Value="Red"/>
                            <Setter Property="Background" Value="Snow"/>
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
    </Grid>
</UserControl>

用法:

<StackPanel>
    <RadioButton x:Name="calcTime" GroupName="CalculationType">Calculate Time</RadioButton>
    <RadioButton x:Name="calcDistance" GroupName="CalculationType">Calculate Distance</RadioButton>
    <local:RequireableTextBox
        IsRequired="{Binding IsChecked, ElementName=calcTime}"
        />
    <local:RequireableTextBox
        x:Name="DistanceValue"
        IsRequired="{Binding IsChecked, ElementName=calcDistance}"
        />
    <!-- Just tossed this in to demonstrate the Text property -->
    <Label Content="{Binding Text, ElementName=DistanceValue}" Foreground="Gray" />
</StackPanel>
于 2017-06-01T19:55:23.623 回答