WPF绑定窗口高度为ViewModel属性

时间:2015-08-21 10:10:01

标签: c# wpf mvvm

这个问题曾被问过一次,但没有得到满意的答案......

我正在关注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但是我的研究并没有带来任何结果。

2 个答案:

答案 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;
    }
}
  • 如果您需要重用此行为,则可以将所有逻辑移至实现为附加属性或自定义混合行为的行为
  • 我建议您仅在属性值更改时引发PropertyChanged。例如if (xWidth != value) OnPropertyChanged("XWidth")

答案 1 :(得分:0)

您可以将绑定模式“双向”添加到您的高度和宽度绑定中。只需将您的 XAML 编辑为如下所示:

Height="{Binding YHeight, Mode=TwoWay}" Width="{Binding XWidth, Mode=TwoWay}">

就是这样。您现在可以从您的视图模型设置窗口大小。