Генерация строки в коде при изменении одного из свойств группы - PullRequest
0 голосов
/ 30 ноября 2010

Я ищу совет о том, как получать уведомления при изменении одного из многих свойств.

Например, допустим, я хочу привязать текст элемента управления к свойству FullAddress в моей WPF ViewModel, по которому я могу рассчитатьмухи всякий раз, когда изменяется одно из набора свойств, таких как StreetNumber, StreetName, Suburb, PostCode и т. д.

Я думаю, что мне нужно привязать свой элемент управления отображением к свойству FullAddress, но как его получитьавтоматически обновляться при изменении одного из зависимых свойств?Могу ли я привязать код свойства к нескольким другим свойствам в той же модели представления?Если так, то как?Есть ли лучший способ?

Ответы [ 4 ]

1 голос
/ 30 ноября 2010

Вы можете использовать MultiBinding и вообще не использовать свойство FullAddress
EDIT
Если вам нужно только показать полный адрес, который вы можете использовать StringFormat

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0}, {1}">
            <Binding Path="City"/>
            <Binding Path="Street"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Если вы хотите разрешить пользователям редактировать всю строку адреса, а затем разбивать ее на части, вам необходимо реализовать IMultiValueConverter интерфейс

1 голос
/ 30 ноября 2010

попробуйте что-то вроде этого:

public class Address : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string address1;
    public string Address1
    {
        get { return address1; }
        set
        {
            address1 = value; 
            OnPropertyChanged("Address1");
            OnPropertyChanged("FullAddress");
        }
    }

    private string address2;
    public string Address2
    {
        get { return address2; }
        set
        {
            address2 = value; 
            OnPropertyChanged("Address2");
            OnPropertyChanged("FullAddress");
        }
    }

    private string town;
    public string Town
    {
        get { return town; }
        set
        {
            town = value; 
            OnPropertyChanged("Town");
            OnPropertyChanged("FullAddress");
        }
    }

    public string FullAddress
    {
        get { return string.Format("{0}, {1}, {2}", address1, address2, town);  }
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
1 голос
/ 30 ноября 2010

Я думаю, что единственный вариант здесь - это чтобы объекты вашего класса подписывались на свои собственные события INPC и автоматически изменяли свои зависимые свойства. Рабочий процесс будет выглядеть так:

  1. Объект создан
  2. Объект подписывается на свой собственный INPC
  3. Зависимое свойство изменено
  4. Подписка INPC обнаруживает, что зависимое свойство для FullAddress изменилось, и обновляет значение FullAddress
  5. Сеттер FullAddress запускает собственное событие INPC
  6. WPF обнаруживает, что FullAddress изменился, и обновляет пользовательский интерфейс

Обновление: Пример кода

class NotificationExample : INotifyPropertyChanged
{
    private string firstName;
    private string lastName;
    public event PropertyChangedEventHandler PropertyChanged;

    public string FirstName
    {
        get { return this.firstName; }

        set
        {
            this.firstName = value;
            this.OnPropertyChanged("FirstName");
        }
    }

    public string LastName
    {
        get { return this.lastName; }

        set
        {
            this.lastName = value;
            this.OnPropertyChanged("LastName");
        }
    }

    public string FullName
    {
        get { return string.Format("{0} {1}", this.firstName, this.lastName); }
    }

    public NotificationExample()
    {
        this.PropertyChanged += this.NotifyIfFullNameChanged;
    }

    private void OnPropertyChanged(string propertyName)
    {
        var handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private void NotifyIfFullNameChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "FirstName" || e.PropertyName == "LastName")
        {
            this.OnPropertyChanged("FullName");
        }
    }
}
1 голос
/ 30 ноября 2010

Предполагая, что ваш класс реализует INotifyPropertyChanged, вы можете уведомить об этом любого установщика свойства.Например,

    #region Implementation of INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            Address.BeginEdit();
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }


    #endregion

    public string FirstLine
    {
        get { return firstLine; }
        set
        {
            firstLine = value;
            OnPropertyChanged("FirstLine");
            OnPropertyChanged("FullAddress");
        }
    }


    public string SecondLine
    {
        get { return secondLine; }
        set
        {
            secondLine= value;
            OnPropertyChanged("SecondLine");
            OnPropertyChanged("FullAddress");
        }
    }

    public string FullAddress
    {
        get { return firstLine + secondLine; }
    }
...