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