我希望能够根据接收到的事件(与文本框中的数字不同)更改文本框前景颜色,但如果通过用户界面更改了任何文本,则将其更改回黑色。我已经用迂回的方式使其工作,但我不确定正确的做法是什么。
XAML:
AcquisitionTimeChangedByInstrument是一个属性,会在ViewModel上引发PropertyChanged。转换器将把false改为黑色,true改为蓝色。
1. 在上面的表单中,它似乎按照描述的方式工作,但这似乎是一种奇怪的方法。如果我使用已注释的行直接更改颜色,则绑定似乎会中断。也就是说,视图停止检查AcquisitionTimeChangedByInstrument的更改。为什么?
2. 正确的做法是什么?
请记住,我只使用WPF几天了;我还不理解高级功能。
编辑(按要求)
最终,我将检查AcquisitionTime中文本框中的值是否已更改。现在,当单击按钮时,我只是将AcquisitionTimeChangedByInstrument设置为true。这将发送PropertyChanged事件,但是如果我之前在回调中未更改acquisitionTxtBox.Foreground,则get将不会被调用。
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();
}
}