wpf窗口宽度没有绑定

时间:2010-07-19 18:10:23

标签: binding

我想通过我的ViewModel控制我的一个窗口的高度和宽度。

这看起来很简单。

<Window ... Width="{Binding Path=Width}" Height="{Binding Path=Height}" />
但是没有。它不起作用。

它会检查ViewModel的Width,但不检查Height

奇怪的是,如果我在XAML中切换WidthHeight的顺序,它会检查Height而不是Width。即它仅检查两个属性中的第一个并完全忽略第二个属性。

绑定MaxHeightMinHeight即使在Width之后也能正常工作。但是用户无法重新调整窗口大小。

6 个答案:

答案 0 :(得分:2)

不知道您的ViewModel代码是什么样的,但尝试为Width和Height属性创建一个集合并将绑定模式设置为TwoWay

答案 1 :(得分:1)

你应该在窗口的加载事件中有这样的东西:

    public void AfterLoad()
    {
        this.Height = this.ViewModel.Settings.WindowHeight;
        this.Width = this.ViewModel.Settings.WindowWidth;

        if (this.ViewModel.Settings.WindowTop > 0 && this.ViewModel.Settings.WindowLeft > 0)
        {
            this.Top = this.ViewModel.Settings.WindowTop;
            this.Left = this.ViewModel.Settings.WindowLeft;
        }
    }

然后,处理窗口的大小更改事件以记住widht和height,并且还将位置更改为记住top,left(如果您愿意)。

绑定到WindowState工作正常。

答案 2 :(得分:0)

我也遇到了这个问题,这似乎是一个错误。

现在我只是处理Window的DataContextChanged事件并手动设置ViewModel的Width和Height。

答案 3 :(得分:0)

这是正确的设计(悲伤但真实)。布局系统实际上并没有强制执行这些值,请参阅windows.Height的msdn文档页面上的备注... 在某些情况下,可以设置MinWidth和MaxWidth(resp。* Height)来实现类似的行为,但并非总是如此。

抱歉没有更好的消息......

答案 4 :(得分:0)

您想要绑定到ActualHeight和ActualWidth,而不是高度和宽度。

所以而不是:

<Window ... Width="{Binding Path=Width}" Height="{Binding Path=Height}" />

你想:

<Window ... Width="{Binding Path=ActualWidth}" Height="{Binding Path=ActualHeight}" />

答案 5 :(得分:0)

我假设你正在使用MVVM模式,通过在ViewModel中实现INotifiyPropertyChanged-Interface,将常见的方法从ViewModel提升到View。

无效:

WdwWidth = 600;
WdwHeight = 600;

RaisePropertyChanged("WdwWidth");
RaisePropertyChanged("WdwHeight");

<强>工作:

WdwWidth = 600;
RaisePropertyChanged("WdwWidth");

WdwHeight = 600;
RaisePropertyChanged("WdwHeight");

在我看来,必须在实际更改属性后立即引发PropertysChanged通知。 奇怪,但对我来说就是诀窍。

编辑确保将Binding设置为TwoWay,例如Height="{Binding Path=WdwHeight, Mode=TwoWay}"