Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将实体的属性更改反映到WPF中的ViewModal_C#_Wpf - Fatal编程技术网

C# 如何将实体的属性更改反映到WPF中的ViewModal

C# 如何将实体的属性更改反映到WPF中的ViewModal,c#,wpf,C#,Wpf,我有一个从INOTIFYPROPERTYCHANGED继承的实体,这个实体绑定到我的UI元素,比如TextBOX。现在,当任何属性发生更改时,我的绑定都会更新,一切正常。我想在viewmodal中捕获此propertychanged事件。我的viewmodal还继承了INOTIFYPROPERTYCHANGED 实体 public class DIPREDIPForView:INotifyPropertyChanged { #region PrivateFields priva

我有一个从INOTIFYPROPERTYCHANGED继承的实体,这个实体绑定到我的UI元素,比如TextBOX。现在,当任何属性发生更改时,我的绑定都会更新,一切正常。我想在viewmodal中捕获此propertychanged事件。我的viewmodal还继承了INOTIFYPROPERTYCHANGED


实体

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,因为我必须基于此调用其他逻辑


我曾尝试在配置的setter中调用OnPropertyChanged(),但它没有启动。每当我在UI上更新一个值时,这个配置都会更新,但不会命中setter中的断点。如何实现这一点。

视图模型或视图模型库都没有订阅PropertyChanged事件。因此,当DIPREDIPForView引发事件时,这两个对象都不会收到事件通知

DIPREDIPViewModel可能需要订阅DIPREDIPForView上的PropertyChanged,事件订阅需要指向BaseViewModel上的OnPropertyChanged事件处理程序

不确定这是否是你要找的

这是一个样本

[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);
        }
    }

}

ViewModel是您的模型的视图。
我会考虑以下内容:

  • 将类型为DIPREDIPForView的memeber添加到类DIPREDIPViewModel
  • 使DIPREDIPForView成为未实现INotifyPropertyChanged的模型
  • 公开属性:FieldDelimiter、TextQualifier和配置,全部来自DIPREDIPViewModel
  • 将视图的DataContext(XAML)设置为ViewModel DIPREDIPViewModel以进行绑定 这样可以将所需的所有内容保留在一个类中,并使更新多个属性变得更简单