将枚举值绑定到XAML标签

4

我正在使用一个枚举字段来跟踪我的程序的状态。

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}}" />

我使用一个转换器(在 Convert 函数下方)。
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变量的状态时,标签没有得到刷新。我该怎么办?

1个回答

4

现在你的UI没有任何方法知道有任何变化。

你需要使用 INotifyPropertyChanged。你应该从你的代码后台中提取属性,并将其放入一个ViewModel中,该ViewModel是你窗口的DataContext。那个ViewModel将实现接口INotifyPropertyChanged。下面是你需要实现INotifyPropertyChanged的全部内容。

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();
    } 
}

这将触发一个事件,您的UI可以通过更改xaml来监听该事件。
<TextBlock Text="{Binding Path=StatoMacchina, Converter={StaticResource StatoMacchinaToString}, UpdateSourceTrigger=PropertyChanged}" />

1
OnPropertyChanged("StatoMacchina") - 15ee8f99-57ff-4f92-890c-b56153
1
@EdPlunkett 忘记包含我的推荐实现OnPropertyChanged。如果您使用[CallerMemberName]标记,则无需指定属性的名称。 - rmn36
1
@rmn32 你比我快太多了!我之前没见过CallerMemberName属性;我主要工作的项目仍然是.NET 4.0,因为某些原因。那很酷。 - 15ee8f99-57ff-4f92-890c-b56153

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