在事件中改变WPF文本框前景色

3
我希望能够根据接收到的事件(与文本框中的数字不同)更改文本框前景颜色,但如果通过用户界面更改了任何文本,则将其更改回黑色。我已经用迂回的方式使其工作,但我不确定正确的做法是什么。
XAML:
<TextBox Style="{StaticResource recParm}" Foreground="{Binding Path=AcquisitionTimeChangedByInstrument, Converter={StaticResource BooleanToBrush}}"  Name="acquisitionTxtBox" TextChanged="onAcquisitionTimeChanged" >
    <TextBox.Text>
        <Binding Path="AcquisitionTime" Mode="TwoWay" StringFormat="{}{0:F6}" UpdateSourceTrigger="PropertyChanged" >
            <Binding.ValidationRules>
                <vm:AcquisitionTimeRule Min="200e-6" Max="40" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

代码背后:

private void onAcquisitionTimeChanged(object sender, TextChangedEventArgs e)
{
    //acquisitionTxtBox.Foreground = Brushes.Black;
    ((ViewModel)Application.Current.Resources["vm"]).AcquisitionTimeChangedByInstrument = false;
}

AcquisitionTimeChangedByInstrument是一个属性,会在ViewModel上引发PropertyChanged。转换器将把false改为黑色,true改为蓝色。
1. 在上面的表单中,它似乎按照描述的方式工作,但这似乎是一种奇怪的方法。如果我使用已注释的行直接更改颜色,则绑定似乎会中断。也就是说,视图停止检查AcquisitionTimeChangedByInstrument的更改。为什么?
2. 正确的做法是什么?
请记住,我只使用WPF几天了;我还不理解高级功能。
编辑(按要求)
最终,我将检查AcquisitionTime中文本框中的值是否已更改。现在,当单击按钮时,我只是将AcquisitionTimeChangedByInstrument设置为true。这将发送PropertyChanged事件,但是如果我之前在回调中未更改acquisitionTxtBox.Foreground,则get将不会被调用。
[ValueConversion(typeof(bool), typeof(SolidColorBrush))]
public class BooleanToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (null == value)
        {
            return null;
        }
        if (value is bool)
        {
            if ((bool)value)
            {
                return (SolidColorBrush)Brushes.DeepSkyBlue;
            }
            return (SolidColorBrush)Brushes.Black;
        }

        Type type = value.GetType();
        throw new InvalidOperationException("No type " + type.Name);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

改变前景色的条件是什么?您能提供条件以及转换器代码,我就可以帮助您了。 - Arushi Agrawal
1个回答

4

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