Предоставление свойства привязке данных в WPF - PullRequest
1 голос
/ 18 января 2011

Это мой сценарий. У меня есть внутренний класс со стандартным свойством int.

public class Session : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;

    private ushort _Level;
    public ushort Level
    {
        get { return _Level; }
    }

    private void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    // a timer code here updates the _Level property every 60 seconds
    // and calls OnPropertyChange("Level");
}

В моем окне пользовательского интерфейса есть метка, которая привязывается к экземпляру Session и отображает значение уровня.

 <TextBlock Name="LevelTextBlock" Text="{Binding SessionInstance.Level, StringFormat='0%'}" />

И конструктор окна имеет такой код:

 public MyWindow()
    {
        SessionInstance = new Session();

        this.InitializeComponent();
    }

    public Session SessionInstance { get; set; }

Однако, как вы можете догадаться, когда я обновляю значение _Level, пользовательский интерфейс не обновляет текстовый блок. Добавление DependancyProperty внутри класса Session недопустимо. Я мог бы сделать это в окне, но тогда мне все еще нужен уведомитель, который бы проверял значение обратно в экземпляр Session. Мне было интересно, если есть элегантный способ сделать это. Я не могу думать ни о чем, кроме запуска другого таймера в окне, которое проверяет и обновляет значение текстового блока. Есть мысли?

Ответы [ 2 ]

4 голосов
/ 18 января 2011

Реализация INotifyPropertyChanged . Существует даже инструмент , который может сделать это автоматически для всех ваших свойств (или только для тех, которые отмечены атрибутом, он достаточно настраивается).

DependencyProperty является излишним, если вам не нужны какие-либо другие его функции (наследование значений, привязка ОТ свойства и т. Д.), Его лучше всего использовать для свойств элемента управления, а не для свойств модели.

EDIT:

Правильно реализовано это выглядит так:

private string familyName;
public string FamilyName
{
    get { return familyName; }
    set 
    {
        if (value != familyName)
        {
            familyName = value;
            OnPropertyChanged("FamilyName");
        }
    }
}
0 голосов
/ 18 января 2011

Вы вызываете OnPropertyChanged из установщика свойств?Это действительно то, где оно принадлежит.

...