这个问题曾被问过一次,但没有得到满意的答案......
我正在关注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但是我的研究并没有带来任何结果。
答案 0 :(得分:2)
我不确定,为什么绑定不起作用,也许它与事实有关,该窗口不仅仅是常规控件,而是围绕WinAPI的某种包装。但是,您仍然可以使用基于事件的方法背后的良好旧代码,即使没有打破MVVM分离关注点。
我编写了MVVM示例,它不使用xaml绑定,但使用“plain eventhandlers”实现双向绑定:
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;
}
}
if (xWidth != value) OnPropertyChanged("XWidth")
答案 1 :(得分:0)
您可以将绑定模式“双向”添加到您的高度和宽度绑定中。只需将您的 XAML 编辑为如下所示:
Height="{Binding YHeight, Mode=TwoWay}" Width="{Binding XWidth, Mode=TwoWay}">
就是这样。您现在可以从您的视图模型设置窗口大小。