C# 属性不会绑定到视图

C# 属性不会绑定到视图,c#,wpf,C#,Wpf,关于使用eventhandler从另一个类获取属性,我们在前面得到了很好的帮助。 结果是在我的ViewModel上出现了一个类似于此的属性,它的行为与我们所熟悉的方式不同 public string Test { get { return _myInterface.Test; } set {_myInterface.Test = value } } 这是我想绑定到我的视图的属性。通常我会这样做: <TextBlock Text="{Bi

关于使用eventhandler从另一个类获取属性,我们在前面得到了很好的帮助。

结果是在我的ViewModel上出现了一个类似于此的属性,它的行为与我们所熟悉的方式不同

 public string Test
    {
        get { return _myInterface.Test; }
        set {_myInterface.Test = value }
    }
这是我想绑定到我的视图的属性。通常我会这样做:

<TextBlock Text="{Binding Test}"/>
public class ViewModel : INotifyPropertyChanged
{
     public string Test
            {
                get { return _myInterface.Test; }
                set
                {
                    _myInterface.Test = value;
                    OnPropertyChanged("Test");
                }

            }

            public event PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }

}
公共新事件属性ChangedEventHandler属性Changed

protected void OnPropertyChanged(string propName)
{
    if (this.PropertyChanged != null)
    {
        this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}  
完整代码:

接口:

 public interface IMyInterFace: INotifyPropertyChanged
    {

        string Test { get; set; }
    }
实现它的类:

public class MyClass : MyInterface
    {

        private string _test;
        public string Test
        {
            get { return _test; }
            set
            {
                _test = value;
                OnPropertyChanged("Test");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            var handler = this.PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }


        public void MyMetod()
        {
            //logic that updates Test
        }
ViewModel:(在构造函数中取接口。)

VM中更改的OnPropertyChanged永远不会被命中

更新:

现在这是我的视图模型:

我摆脱了MVVM light,现在这样做:

<TextBlock Text="{Binding Test}"/>
public class ViewModel : INotifyPropertyChanged
{
     public string Test
            {
                get { return _myInterface.Test; }
                set
                {
                    _myInterface.Test = value;
                    OnPropertyChanged("Test");
                }

            }

            public event PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }

}

但事件处理程序从未被命中。测试属性中的
值从未正确分配。即使我可以在将鼠标悬停在
值上时“看到”该值
。非常感谢您的帮助。

您需要实现
INotifyPropertyChanged
并在设置
测试时提高它

public class YourClass : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

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

        public string Test
        {
            get
            {
                return _myInterface.Test;
            }
            set
            {
                _myInterface.Test = value;
                OnPropertyChanged();
            }
        }
    }
您是否尝试将“UpdateSourceTrigger”设置为“PropertyChanged”

*编辑#2: 在最后一段代码(ViewModel)中,您似乎忘记将属性的名称传递给OnPropertyChanged()方法


您正在使用
new
关键字
在viewmodel的基类中隐藏
PropertyChangedEventHandler

public new event PropertyChangedEventHandler PropertyChanged;
您的viewmodel可能是从另一个类继承的,该类也实现了
INotifyPropertyChanged
。如果是这样,就不需要重新实现接口

更新:

我拿了一个我现有的项目,并以如下相同的方式破坏了它:

给定现有通知程序基类:

public class NotifierBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
以及实施者:

public class MainWindowViewModel : NotifierBase
{
    private bool someProperty;
    public bool SomeProperty 
    {
        get
        {
            return this.someProperty;
        }
        set
        {
            if (this.someProperty != value)
            {
                this.someProperty = value;
                this.OnPropertyChanged();
            }
        }
    }
}
当我更改视图模型类时,如下所示:

public class MainWindowViewModel : NotifierBase
{
    private bool someProperty;
    public bool SomeProperty 
    {
        get
        {
            return this.someProperty;
        }
        set
        {
            if (this.someProperty != value)
            {
                this.someProperty = value;
                this.OnPropertyChanged();
            }
        }
    }

    public new event PropertyChangedEventHandler PropertyChanged;

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

这和你描述的完全一样。仅执行一次
属性ChangedEventHandler

看起来不错。它不会更新,因为您没有实现INotifyPropertyChanged
,但除此之外,它看起来还不错。您需要发布更多代码。谢谢,我在其中进行了编辑(希望是正确的),我已经实现了INotifyPropertyChanged。但是仍然没有更新视图。请检查
窗口
对象(或您正在使用的任何容器)的
DataContext
。可能是调试绑定的好方法。所以。。。visual studio的输出窗口中是否出现绑定错误?抱歉,我不知道如何在输出窗口中检查绑定。现在就开始阅读。感谢您提供的提示,请尝试添加:UpdateSourceTrigger=PropertyChanged。同样的结果…仍然不会被击中。在myClass中,如果我在测试的setter中放置断点。当它停止时,我可以在Visual studio中“更改页面”并查看ViewModel.cs文件。如果将鼠标放在值上,我可以在那里看到正确的值。但是它并没有被正确地分配给这个属性。你是对的。我使用MVVM light,它允许我的VM继承RaisePropertyChanged。即使删除了“new”-关键字,也不会被点击。但是我认为我们可能会有一些问题……不要只是删除
new
关键字——从类中删除事件和方法。如果MVVM light(我不熟悉)提供了一个实现了
INotifyPropertyChanged
的基类,只需在基类中使用该实现即可。。。或者不要使用MVLight的基类。或者。只是不要有两个事件的实现,因为这是导致您的问题的原因。谢谢!如果可以,请查看更新。
public new event PropertyChangedEventHandler PropertyChanged;
public class NotifierBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
public class MainWindowViewModel : NotifierBase
{
    private bool someProperty;
    public bool SomeProperty 
    {
        get
        {
            return this.someProperty;
        }
        set
        {
            if (this.someProperty != value)
            {
                this.someProperty = value;
                this.OnPropertyChanged();
            }
        }
    }
}
public class MainWindowViewModel : NotifierBase
{
    private bool someProperty;
    public bool SomeProperty 
    {
        get
        {
            return this.someProperty;
        }
        set
        {
            if (this.someProperty != value)
            {
                this.someProperty = value;
                this.OnPropertyChanged();
            }
        }
    }

    public new event PropertyChangedEventHandler PropertyChanged;

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