将窗口高度绑定到ViewModel属性
本文关键字:ViewModel 属性 绑定 窗口 高度 | 更新日期: 2023-09-27 18:09:00
这个问题以前已经问过一次了,但是没有得到一个满意的答案…
我遵循MVVM设计原型,我希望能够改变窗口的宽度和高度。为此,我决定在ViewModel中创建两个属性:
private int xWidth;
public int XWidth
{
get { return xWidth; }
set
{
xWidth = value;
RaisePropertyChanged("XWidth");
}
}
private int yHeight;
public int YHeight
{
get { return yHeight; }
set
{
yHeight = value;
RaisePropertyChanged("YHeight");
}
}
然后我将高度和宽度绑定到这些属性:
Height="{Binding YHeight}" Width="{Binding XWidth}">
最后我创建了一个方法来改变这些值:
private void HomeExecute()
{
ShowMain = true;
ShowSearch = false;
YHeight = 350;
XWidth = 525;
}
然而,这不起作用。当该方法执行时,窗口的大小不会改变。
我知道View被正确地绑定到ViewModel上,就像其他绑定一样。
我还知道,当ShowMain属性被更改时,该方法正在运行。
我有一种预感,它可能需要各种转换器,因为我传递到宽度和高度属性的int,但我的研究没有导致任何
我不确定,为什么绑定不起作用,也许它与事实有关,该窗口不仅仅是常规控制,而是围绕WinAPI的某种包装。然而,你仍然可以在基于事件的方法背后使用好的旧代码,即使没有破坏MVVM的关注点分离。
我已经编写了MVVM示例,它不使用xaml绑定,而是使用"普通事件处理程序"实现双向绑定:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
Loaded += delegate
{
Height = ViewModel.YHeight;
Width = ViewModel.XWidth;
ViewModel.PropertyChanged += ViewModelOnPropertyChanged;
SizeChanged += MainWindow_SizeChanged;
};
Unloaded += delegate
{
ViewModel.PropertyChanged -= ViewModelOnPropertyChanged;
SizeChanged -= MainWindow_SizeChanged;
};
}
public MainWindowViewModel ViewModel
{
get { return (MainWindowViewModel)DataContext; }
}
private void ViewModelOnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "YHeight")
{
Height = ViewModel.YHeight;
}
if (e.PropertyName == "XWidth")
{
Width = ViewModel.XWidth;
}
}
void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e)
{
ViewModel.XWidth = e.NewSize.Width;
ViewModel.YHeight = e.NewSize.Height;
}
}
- 如果您需要重用此行为,您可以将所有逻辑移动到作为附加属性或自定义混合行为实现的行为
- 我建议您仅在属性值更改时引发PropertyChanged。例如
if (xWidth != value) OnPropertyChanged("XWidth")
可以通过两种方式添加绑定模式到你的高度和宽度绑定。只需编辑你的XAML如下所示:
Height="{Binding YHeight, Mode=TwoWay}" Width="{Binding XWidth, Mode=TwoWay}">
就是这样。现在,您可以从视图模型中设置窗口大小。