我想通过我的ViewModel控制我的一个窗口的高度和宽度。
这看起来很简单。
<Window ... Width="{Binding Path=Width}" Height="{Binding Path=Height}" />
但是没有。它不起作用。
它会检查ViewModel的Width
,但不检查Height
。
奇怪的是,如果我在XAML中切换Width
和Height
的顺序,它会检查Height
而不是Width
。即它仅检查两个属性中的第一个并完全忽略第二个属性。
绑定MaxHeight
和MinHeight
即使在Width
之后也能正常工作。但是用户无法重新调整窗口大小。
答案 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}"