我正在使用Enum字段来跟踪我的程序状态。
public enum StatiMacchina {
InAvvio = 1,
Pronta = 2,
InLavorazione = 3,
InMovimento = 4,
InAttesa = 5,
InErrore = 6
}
我想绑定跟随字段的状态(在主窗口中)
public StatiMacchina StatoMacchina { get; set; }
在XAML中带有标签。
<TextBlock Text="{Binding Path=StatoMacchina, Converter={StaticResource StatoMacchinaToString}}" />
我使用转换器(转换功能下方)
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
switch ((StatiMacchina)value) {
case StatiMacchina.InAvvio: return "txt1";
case StatiMacchina.Pronta: return "txt2";
case StatiMacchina.InLavorazione: return "txt3";
case StatiMacchina.InMovimento: return "txt4";
case StatiMacchina.InAttesa: return "txt5";
case StatiMacchina.InErrore: return "txt6";
default: return "Oppss";
}
}
当我的程序启动时,标签包含正确的值,但是当我更新StatoMacchina变量的状态时,标签不会得到刷新。 我该怎么办?
答案 0 :(得分:4)
现在你的用户界面无法知道任何事情已发生变化。
您需要使用INotifyPropertyChaged
。您应该从后面的代码中提取属性并将其放在ViewModel中,该ViewModel是窗口的DataContext。 ViewModel将实现接口INotifyPropertyChaged
。以下是您实施INotifyPropertyChaged
所需的全部内容。
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propName = null)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
您需要展开属性的setter以设置值,然后触发OnPropertyChanged事件。像这样......
public StatiMacchina StatoMacchina {
get;
set{
backingVariable = value;
OnPropertyChanged();
}
}
这将通过将您的xaml更改为此来触发您的UI可以侦听的事件。
<TextBlock Text="{Binding Path=StatoMacchina, Converter={StaticResource StatoMacchinaToString}, UpdateSourceTrigger=PropertyChanged}" />