控制数据绑定以在MVVM场景中查看不是ViewModel

时间:2013-05-01 21:45:01

标签: c# wpf mvvm binding icommand

我已经使用MVVM模型已经有一个星期左右的时间了,我想我已经掌握了现在应该去的地方。请注意“思考”。

我有一个ViewModel,我的视图(MainWindow)绑定到

_ViewModel = new MainViewModel();
this.DataContext = _ViewModel;

我有一些ICommands在ViewModel中工作,随后是模型,我很好。

现在我从我的View(MainWindow)中启动了一些窗口,我在代码隐藏中做了一些窗口,因为它们都是纯粹与视图相关的东西。我试图复制我在视图中的ViewModel中的ICommand设置,以简化我的生活,或者我想。我有以下命令设置:

public ICommand comInitialiseWindows { get; private set; }

private bool _windowsactive = false;
public bool WindowsActive
{
    get { return _windowsactive; }
    set { SetProperty(ref _windowsactive, value); }
}
public bool comInitialiseWindows_CAN()
{
    return !_windowsactive;
}
private void comInitialiseWindows_DO()
{
    ... Code to do the window creation, etc.
}

我在MainWindow代码中有这个relay命令:

comInitialiseWindows = new RelayCommand(() => comInitialiseWindows_DO(), comInitialiseWindows_CAN);

如果我将它放在ViewModel中,除了窗口创建之外它还可以使用它,但是因为它与View相关,所以我并不感到惊讶。

所以问题是当我点击按钮时代码没有运行。我猜测XAML绑定到了ViewModel,但是如果不在代码隐藏中将每个按钮的Binding设置为MainWindow,我就无法解决这个问题。我曾假设以下内容可行,但事实并非如此:

<Button x:Name="ribbutLayoutWindows"                                     
    Command="{Binding local:comInitialiseWindows}" 
    IsEnabled="{Binding local:comInitialiseWindows_CAN}"/>

我很确定我只是在某个地方找不到东西。或者我试图过度复杂的事情,正常的按钮点击已经足够,因为它只是查看。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

有两种可能性:

通过ViewModel : 您可以在ViewModel上公开一个属性:

class MainViewModel
{
    ICommand comInitialiseWindows  {get; set;}
}

在您的MainWindow中:

MainViewModel vm = this.DataContext as MainViewModel;
vm.comInitialiseWindows  = new RelayCommand(() => comInitialiseWindows_DO(), comInitialiseWindows_CAN);

XAML:

<Button x:Name="ribbutLayoutWindows" Command="{Binding comInitialiseWindows}" />

注意:您不需要绑定IsEnabled属性。 WPF将为您处理,并自动调用ICommand的CanExecute方法。

通过DependencyProperty

在您的代码隐藏中声明此dependecyProperty:

public ICommand comInitialiseWindows
{
    get { return (ICommand)GetValue(MyPropertyProperty); }
    set { SetValue(MyPropertyProperty, value); }
}

public static readonly DependencyProperty comInitialiseWindowsProperty = 
    DependencyProperty.Register("comInitialiseWindows", typeof(ICommand), typeof(MainWindow), new PropertyMetadata(null));

在代码隐藏中分配值:

comInitialiseWindows = new RelayCommand(() => comInitialiseWindows_DO(), comInitialiseWindows_CAN);

之后,您需要在XAML中打破数据上下文。首先,给你的页面命名:

<Window x:Class="Web_Media_Seeker_WPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:local="clr-namespace:Web_Media_Seeker_WPF"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="myWindow"
        Title="MainWindow" Height="350" Width="525">

然后按如下方式声明你的绑定:

<Button x:Name="ribbutLayoutWindows" Command="{Binding comInitialiseWindows, ElementName=myWindow}" />