Как отразить изменение свойства для объекта в ViewModal в WPF - PullRequest
0 голосов
/ 30 сентября 2010

У меня есть объект, который наследует от INOTIFYPROPERTYCHANGED, этот объект связан с моими элементами пользовательского интерфейса, такими как TextBOX. Теперь при изменении какого-либо свойства мои привязки обновляются и все работает нормально. То, что я хочу, это перехватить это свойство, измененное в моем представлении. мой viewmodal также наследуется от INOTIFYPROPERTYCHANGED.


Entity

public class DIPREDIPForView:INotifyPropertyChanged
{
    #region PrivateFields
    private string fieldDelimiter, textQualifier;

    #endregion
    public DIPREDIPForView()
    {

    }
    public string FieldDelimiter
    {
        get
        {
            return fieldDelimiter;
        }
        set
        {
            fieldDelimiter = value;
            OnPropertyChanged("FieldDelimiter");
            //NotifyViewModalEvent();
        }
    }
    public string TextQualifier {
        get
        {
            return textQualifier;
        }
        set
        {
            textQualifier = value;
            OnPropertyChanged("TextQualifier");
            //NotifyViewModalEvent();
        }
    }
    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
    #endregion

VIEWMODAL

public class DIPREDIPViewModel : BaseViewModel
{

    public DIPREDIPForView Configuration
    {
        get
        {
            return configuration;
        }
        set
        {
            configuration = value;               
        }
    }

}

BaseViewModal

public class BaseViewModel : INotifyPropertyChanged, IDisposable
{
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;


    public virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
    #endregion


}

Что я хочу, так это когда бы ни менялась «Конфигурация», ViewModal должен быть уведомлен, так как я должен вызвать другую логику, основанную на этом.

Я попытался вызвать OnPropertyChanged () в установщике конфигурации, но он не срабатывает. всякий раз, когда я обновляю значение в пользовательском интерфейсе, эта конфигурация обновляется, но точка останова в установщике не достигается. Как мне этого добиться.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2010

ViewModel - это представление вашей модели.
Я бы рассмотрел следующее:

  1. Добавьте член типа DIPREDIPForView в класс DIPREDIPViewModel
  2. Сделайте DIPREDIPForView модельюкоторый не реализует INotifyPropertyChanged
  3. Свойства представления: FieldDelimiter, TextQualifier и Configuration все из DIPREDIPViewModel
  4. Установите DataContext для представления (XAML) для ViewModel DIPREDIPViewModel для привязки.

Это позволяет хранить все необходимое в одном классе и упрощает обновление нескольких свойств.

0 голосов
/ 30 сентября 2010

ни модель представления, ни база модели представления не подписываются на событие PropertyChanged. Таким образом, ни один из этих объектов не получит уведомление о событии, когда оно вызвано DIPREDIPForView.

предположительно DIPREDIPViewModel должен подписаться на PropertyChanged в DIPREDIPForView, а подписка на событие должна указывать на обработчик события OnPropertyChanged в BaseViewModel.

Не уверен, что это то, что вы ищете.

Вот пример ...

[Test]
public void TestEventIsRaised()
{
    TestEventSubscriber subscriber = new TestEventSubscriber();
    subscriber.SetFirstName("joe");
    Assert.IsTrue(subscriber.EventWasHandledInTestDouble);
}


public class TestEventSubscriber : EventSubscriber
{
    public bool EventWasHandledInTestDouble;
    public TestEventSubscriber()
    {

    }

    protected override void OnMyEvent(object sender, EventArgs args)
    {
        EventWasHandledInTestDouble = true;
    }
}

public class EventSubscriber
{
    private EventRaiser eventRaiser = new EventRaiser();

    public EventSubscriber()
    {
        eventRaiser.MyEvent += (sender, args) => {
            Console.Write("Event was handled via anonymous delegate");
        };

        eventRaiser.MyEvent = OnMyEvent;
    }

    public void SetFirstName(string firstName)
    {
        eventRaiser.FirstName = "bob";
    }

    protected virtual void OnMyEvent(object sender, EventArgs args)
    {
        Console.WriteLine("Event was handled via virtual method...");
    }
}


public class EventRaiser
{
    public EventHandler MyEvent;

    public EventRaiser()
    {

    }

    private string firstName;
    public string FirstName
    {
        get
        {
            return firstName;
        }
        set
        {
            firstName = value;
            EventHandler handler = this.MyEvent;
            if (handler != null)
                MyEvent(this, EventArgs.Empty);
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...