WPF datatrigger not firing



我正在尝试根据其内容更改文本框的背景颜色。

使用断点,我看到我的ValueConverter被构造了,但是转换或转换方法都不会被调用,因此样式不起作用。

XAML中的" LightBlue"样式确实在启动时起作用。

我试图使用史努比,但我不知道我在寻找什么。

xaml ...

    <Grid.Resources>
        <local:ThreadCreationLimitChanged x:Key="ThreadCreationLimitChanged"></local:ThreadCreationLimitChanged>
    </Grid.Resources>
    <Label Grid.Row="0" Grid.Column="0" Margin="0, 5, 0, 0" Content="New Thread Limit"></Label>
    <TextBox Grid.Row="0" Grid.Column="1" Margin="10, 5, 10, 0" Width="100" Text="{Binding Path=ManagerConfig.ThreadCreationLimit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
        <TextBox.Style>
            <Style>
                <Setter Property="TextBox.Background" Value="LightBlue"></Setter>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=Text,Converter={StaticResource ThreadCreationLimitChanged}}" Value="false">
                        <Setter Property="TextBox.Background" Value="Yellow"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

valueconverter ...

public class ThreadCreationLimitChanged : IValueConverter
{
    public ThreadCreationLimitChanged()
    {
    }
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.ToString() == "120";
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

class managerconfig ...(notifypropertychanged insterment inotifyPropertychanged)

class ManagerConfig : NotifyPropertyChanged
{
    private uint _ThreadCreationLimit;
    public uint ThreadCreationLimit
    {
        get { return _ThreadCreationLimit; }
        set
        {
            _ThreadCreationLimit = value;
            OnPropertyChanged("ThreadCreationLimit");
        }
    }

将此{Binding Path=Text,Converter={StaticResource ThreadCreationLimitChanged}}更改为 {Binding Path=Text, RelativeSource={RelativeSource Self} ,Converter={StaticResource ThreadCreationLimitChanged}}

为什么不在ManagerConfig上创建一个计算属性,该属性报告了ThreadCreationLimit更改的状态?这样一来,人们就不需要转换器。这样的代码:

public bool IsOverLimit { get { return ThreadCreationLimit > 120 } }
 public uint ThreadCreationLimit
    {
        get { return _ThreadCreationLimit; }
        set
        {
            _ThreadCreationLimit = value;
            OnPropertyChanged("ThreadCreationLimit");
            OnPropertyChanged("IsOverLimit");
        }
    }

然后将数据触发器绑定到IsOverLimit,每次设置/更改ThreadCreationLimit时都会发送更改通知。

附加的加上是业务逻辑在预期的类中,而不是转换器。

我猜你有绑定错误。

1)直接访问文本框以获取价值,

<Grid.Resources>
    <local:ThreadCreationLimitChanged x:Key="ThreadCreationLimitChanged"></local:ThreadCreationLimitChanged>
</Grid.Resources>
<Label Grid.Row="0" Grid.Column="0" Margin="0, 5, 0, 0" Content="New Thread Limit"></Label>
<TextBox x:Name="tBox" Grid.Row="0" Grid.Column="1" Margin="10, 5, 10, 0" Width="100" Text="{Binding Path=ManagerConfig.ThreadCreationLimit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
    <TextBox.Style>
        <Style>
            <Setter Property="TextBox.Background" Value="LightBlue"></Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Text, ElementName=tBox,Converter={StaticResource ThreadCreationLimitChanged}}" Value="false">
                    <Setter Property="TextBox.Background" Value="Yellow"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

2)加入正确的模型值,

 <Grid.Resources>
    <local:ThreadCreationLimitChanged x:Key="ThreadCreationLimitChanged"></local:ThreadCreationLimitChanged>
</Grid.Resources>
<Label Grid.Row="0" Grid.Column="0" Margin="0, 5, 0, 0" Content="New Thread Limit"></Label>
<TextBox Grid.Row="0" Grid.Column="1" Margin="10, 5, 10, 0" Width="100" Text="{Binding Path=ManagerConfig.ThreadCreationLimit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
    <TextBox.Style>
        <Style>
            <Setter Property="TextBox.Background" Value="LightBlue"></Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=ManagerConfig.ThreadCreationLimit,Converter={StaticResource ThreadCreationLimitChanged}}" Value="false">
                    <Setter Property="TextBox.Background" Value="Yellow"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

最新更新