【问题标题】:Bind Enum value to Label XAML将枚举值绑定到标签 XAML
【发布时间】:2015-09-24 19:11:20
【问题描述】:

我正在使用 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 变量的状态时,标签没有得到刷新。 我该怎么办??

【问题讨论】:

    标签: c# wpf xaml enums


    【解决方案1】:

    现在,您的 UI 无法知道发生了什么变化。

    您需要使用INotifyPropertyChaged。您应该从后面的代码中提取属性并将其放入作为窗口的 DataContext 的 ViewModel 中。该 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));
            }
        }
    

    您需要扩展属性的设置器以设置值,然后触发 OnPropertyChanged 事件。像这样..

    public StatiMacchina StatoMacchina { 
        get; 
        set{
           backingVariable = value;
           OnPropertyChanged();
        } 
    }
    

    这将触发一个事件,您的 UI 可以通过将您的 xaml 更改为此来侦听。

    <TextBlock Text="{Binding Path=StatoMacchina, Converter={StaticResource StatoMacchinaToString}, UpdateSourceTrigger=PropertyChanged}" />
    

    【讨论】:

    • OnPropertyChanged("StatoMacchina")
    • @EdPlunkett 忘记包含我推荐的 OnPropertyChanged 实现。如果您使用 [CallerMemberName] 标签,则不必指定属性的名称
    • @rmn32 你对我来说太快了!我以前没见过CallerMemberName 属性的东西;由于原因,我从事的主要项目仍然是 .NET 4.0。这很酷。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2015-10-17
    相关资源
    最近更新 更多