我已经使用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}"/>
我很确定我只是在某个地方找不到东西。或者我试图过度复杂的事情,正常的按钮点击已经足够,因为它只是查看。
有什么建议吗?
答案 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}" />