MaxHeight MaxWidth绑定不会更改UI

时间:2017-05-18 20:29:01

标签: c# wpf

我正在努力解决以下绑定似乎对用户界面没有影响的问题:

<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也存在同样的错误。

我尝试使用工具监听手动更改此值。当我这样做时,控件中的更改 会反映出来。

2 个答案:

答案 0 :(得分:1)

在评论中,当监视器大小发生变化时,会调用AllowedHorizontalSpace的setter,但不会调用getter。

INotifyPropertyChanged实现从这里开始,当通过Snoop设置AllowedHorizontalSpace时,整个过程正常工作,因此 是正确的,{{1}必须是viewmodel的一个实例。

这种情况通常是由冗余的viewmodel实例引起的。通常,一个在XAML中创建,另一个在代码隐藏构造函数中创建。分配给DataContext的第二个实例是属性将绑定到的实例,但您可能在第一个实例上设置属性。在这种情况下,setter将在第一个上执行,但由于没有绑定使用该实例作为源,因此不会调用getter。

你提到viewmodel的DataContext方法意外地被调用了两次,如果上面是这种情况,这就是我所期望的。

答案 1 :(得分:-2)

问题是AllowedHorizo​​ntalSpace不是依赖项属性,但您正在使用依赖项属性更改通知。

要做的是在视图模型上实现INotifyPropertyChanged。将属性实现更改为以下内容,一切都将开始工作。

{{1}}