Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bind Enum value to Label XAML

Tags:

c#

enums

wpf

xaml

I'm using a Enum field to follow the state of my program.

public enum StatiMacchina {
        InAvvio = 1,
        Pronta = 2,
        InLavorazione = 3,
        InMovimento = 4,
        InAttesa = 5,
        InErrore = 6
}

I would to bind the state of the follow field (in the main window)

public StatiMacchina StatoMacchina { get; set; }

with a label in XAML.

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

I use a converter (below the Convert function)

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

When my program start the label contains the correct value, but when I update the state of the StatoMacchina variable, the label doesn't get the refresh. What can I do??

like image 213
somejhereandthere Avatar asked Oct 14 '25 11:10

somejhereandthere


1 Answers

Right now your UI has no way of knowing that anything has changed.

You need to use INotifyPropertyChaged. You should pull the property from your code behind and put it in a ViewModel that is the DataContext of your window. That ViewModel will implement the interface INotifyPropertyChaged. Below is all you need to implement INotifyPropertyChaged.

public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propName = null)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }

You need to expand the setter of your property to set the value then fire an OnPropertyChanged event. like so..

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

This will fire an event that your UI can listen for by changing your xaml to this.

<TextBlock Text="{Binding Path=StatoMacchina, Converter={StaticResource StatoMacchinaToString}, UpdateSourceTrigger=PropertyChanged}" />
like image 198
rmn36 Avatar answered Oct 17 '25 00:10

rmn36