WPF转换器以实时更新文本框背景颜色的方式进行文本更改

8

我有两个文本框用于输入用户的名字和姓氏,并且我创建了一个转换器,当文本等于特定字符串时更改文本框的背景颜色。但是我遇到的问题是,文本框只会在运行时更新,而当我更改文本框中的文本时,它不会更新。

XAML:

<TextBox x:Name="forenameTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="1" 
                 Background="{Binding Staff,Converter ={StaticResource StaffNameToBackgroundColourConverter1}}"  
                 Text="{Binding Staff.Forename, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/>
<Label  Content="Surname:" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="2" VerticalAlignment="Center"/>
<TextBox x:Name="surnameTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="2"
                 Background="{Binding Staff,Converter={StaticResource StaffNameToBackgroundColourConverter1}}"  
                 Text="{Binding Staff.Surname, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/>

代码转换器:

public class StaffNameToBackgroundColourConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var staff  = (Staff) value;
        if (staff.Forename == "Donald" && staff.Surname == "Duck")
        {
            return "Yellow";
        }
        else
        {
            return "White";
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

正确的文本输入:

正确的文本输入

错误的文本输入 - 没有更改:

错误的文本输入 - 没有更改


你的问题在于Staff没有被通知更新。Staff.ForenameStaff.Surname正在更新,但这并不意味着Staff会自动更新。如果你在转换器中设置一个断点,我想当你开始在文本框中输入时,它永远不会被触发。你的转换器没问题,麻烦出现在你的文本框绑定的数据上。 - Stewbob
3个回答

2
您需要在您的绑定中添加UpdateSourceTrigger=PropertyChanged
<TextBox x:Name="forenameTextBox" Grid.Column="1" HorizontalAlignment="Left" 
    Height="23" Margin="3" Grid.Row="1" Background="{Binding Staff, 
    UpdateSourceTrigger=PropertyChanged, Converter ={StaticResource 
    StaffNameToBackgroundColourConverter1}}" Text="{Binding Staff.Forename, 
    Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" 
    VerticalAlignment="Center" Width="120"/>

<TextBox x:Name="surnameTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" 
    Margin="3" Grid.Row="2" Background="{Binding Staff, 
    UpdateSourceTrigger=PropertyChanged, Converter={StaticResource 
    StaffNameToBackgroundColourConverter1}}" Text="{Binding Staff.Surname, Mode=TwoWay, 
    NotifyOnValidationError=true, ValidatesOnExceptions=true}" 
    VerticalAlignment="Center" Width="120"/>

当用户输入每个字母时,这将更新绑定源。您可以从MSDN的Binding.UpdateSourceTrigger 属性页面了解更多信息。


我尝试使用UpdateSourceTrigger,但没有任何改变。 - NigelMassey
我不太确定该告诉你什么。这个属性做了你要求的事情...也许你应该尝试在一个更简单的绑定上使用它,或者阅读链接页面自己看看。 - Sheridan

2
您应该返回一些刷子对象而不是像下面这样的背景颜色。
public class StaffNameToBackgroundColourConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo 
 culture)
{
    var staff = (Staff)value;
    if (staff.Forename == "Donald" && staff.Surname == "Duck")
    {
        return new SolidColorBrush(Colors.Yellow);

    }
    else
    {
        return new SolidColorBrush(Colors.White);
    }
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    return value;
}
}

1
首先,您将UpdateSourceTrigger=PropertyChanged添加到了错误的绑定上。您需要将其添加到Text属性的绑定中。
其次,您将Text属性绑定到了Staff.Forename,但将Background绑定到了Staff。当您在Staff.Forename中编写时,Background属性不知道Staff已更改。您需要在编写Staff.Forename属性时为Staff属性触发PropertyChanged事件。对于Staff.Surname也是同样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接