1 回答
TA贡献1789条经验 获得超10个赞
“冒泡”是路由事件的概念。像 PropertyChanged 这样的常规事件不会“冒泡”。
除了tnc = tnc;ViewModel 中的明显错误(应该是this.tnc = tnc;)之外,这两个类的 Test 属性是不相关的。为了更新自己的 Test 属性,ViewModel 必须在 处注册一个 PropertyChanged 事件处理程序tnc。并且它必须tnc在其自身的 Test 属性更改时更新该属性。
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private TestNotifyChanged tnc;
public ViewModel(TestNotifyChanged t)
{
tnc = t;
tnc.PropertyChanged += (s, e) =>
{
if (e.PropertyName == nameof(Test) || string.IsNullOrEmpty(e.PropertyName))
{
Test = tnc.Test; // update ViewModel.Test from TestNotifyChanged.Test
}
};
}
private string test;
public string Test
{
get
{
return test; // always return own value
}
set
{
if (test != value)
{
test = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Test)));
tnc.Test = Test; // update TestNotifyChanged.Test from ViewModel.Test
}
}
}
}
或者,删除 Test 属性的支持字段并仅操作tnc.Test:
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private TestNotifyChanged tnc;
public ViewModel(TestNotifyChanged t)
{
tnc = t;
tnc.PropertyChanged += (s, e) =>
{
if (e.PropertyName == nameof(Test) || string.IsNullOrEmpty(e.PropertyName))
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Test)));
}
};
}
public string Test
{
get { return tnc.Test; }
set { tnc.Test = Test; }
}
}
幸运的是,这完全没有必要。
相反,可能只是一个公共Tnc财产,如
public class ViewModel
{
public TestNotifyChanged Tnc { get; }
public ViewModel(TestNotifyChanged tnc)
{
Tnc = tnc;
}
}
使用这样的绑定:
<TextBlock Text="{Binding Tnc.Test}"/>
- 1 回答
- 0 关注
- 377 浏览
添加回答
举报