我正在努力解决以下绑定似乎对用户界面没有影响的问题:
<Toolbar MaxWidth="{Binding AllowedHorizontalSpace}" />
财产和字段:
private int allowedHorizontalSpace;
public int AllowedHorizontalSpace {
get { return this.allowedHorizontalSpace; }
set {
this.allowedHorizontalSpace = value;
this.OnPropertyChanged(nameof(this.AllowedHorizontalSpace));
}
}
在侦听监视器大小更改的函数中:
this.AllowedHorizontalSpace = (int) (monitorWidth * 0.4)
我错过了什么?控件的大小只是不想改变! MaxHeight也存在同样的错误。
我尝试使用工具监听手动更改此值。当我这样做时,控件中的更改 会反映出来。
答案 0 :(得分:1)
在评论中,当监视器大小发生变化时,会调用AllowedHorizontalSpace
的setter,但不会调用getter。
INotifyPropertyChanged
实现从这里开始,当通过Snoop设置AllowedHorizontalSpace
时,整个过程正常工作,因此 是正确的,{{1}必须是viewmodel的一个实例。
这种情况通常是由冗余的viewmodel实例引起的。通常,一个在XAML中创建,另一个在代码隐藏构造函数中创建。分配给DataContext
的第二个实例是属性将绑定到的实例,但您可能在第一个实例上设置属性。在这种情况下,setter将在第一个上执行,但由于没有绑定使用该实例作为源,因此不会调用getter。
你提到viewmodel的DataContext
方法意外地被调用了两次,如果上面是这种情况,这就是我所期望的。
答案 1 :(得分:-2)
问题是AllowedHorizontalSpace不是依赖项属性,但您正在使用依赖项属性更改通知。
要做的是在视图模型上实现INotifyPropertyChanged。将属性实现更改为以下内容,一切都将开始工作。
{{1}}