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

C# 控制数据绑定以在MVVM场景中不查看ViewModel,c#,wpf,mvvm,binding,icommand,C#,Wpf,Mvvm,Binding,Icommand,我已经用MVVM模型工作了一周左右,我想我已经掌握了现在应该做什么。注意其中的“思考” 我的视图(主窗口)绑定到一个ViewModel 我有几个icommand可以在ViewModel中工作,然后在模型中工作,我对此很满意 现在,我从我的视图(MainWindow)启动了几个窗口,我在codebehind中这样做,因为这些都是纯视图相关的东西。我试图在视图中复制ViewModel中的ICommand设置,以简化我的生活,至少我是这么想的。我设置了以下命令: public ICommand com

我已经用MVVM模型工作了一周左右,我想我已经掌握了现在应该做什么。注意其中的“思考”

我的视图(主窗口)绑定到一个ViewModel

我有几个icommand可以在ViewModel中工作,然后在模型中工作,我对此很满意

现在,我从我的视图(MainWindow)启动了几个窗口,我在codebehind中这样做,因为这些都是纯视图相关的东西。我试图在视图中复制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.
}
我在主窗口代码中有此中继命令:

comInitialiseWindows = new RelayCommand(() => comInitialiseWindows_DO(), comInitialiseWindows_CAN);
如果我把它放在ViewModel中,除了窗口创建之外,它还起到了一种作用,但由于它与视图相关,我并不感到惊讶

所以问题是当我点击按钮时,代码没有运行。我猜XAML是绑定到ViewModel的,但是如果不在codebehind中设置每个按钮到主窗口的绑定,我想不出解决这个问题的方法。我本以为以下方法可行,但事实并非如此:

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

我很确定我只是没有得到什么东西。或者我正试图把事情复杂化,正常的按钮点击就足够了,因为它只是视图而已


有什么建议吗?

有两种可能性:

通过视图模型: 您可以公开ViewModel上的属性:

class MainViewModel
{
    ICommand comInitialiseWindows  {get; set;}
}
在主窗口中:

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

在代码隐藏中指定一个值:

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}" />


为什么“启动几个窗口”与纯视图相关?您的viewmodel包含视图逻辑,视图仅为用户可视化viewmodel。我使用从viewmodel调用的服务来启动新的对话框或窗口。顺便说一句,你应该检查一下你是否需要新的窗口,或者只是切换主视图的用户控件。谢谢你的回复。除非我在您的第一个示例中弄错了,“\u DO”将出现在ViewModel中。我已经试过了,并且工作得很好,只是我需要在主窗口代码中进行窗口处理。我已经看了第二个例子,但它似乎对我一点也不起作用。我猜你把“MyPropertyProperty”放在哪里应该是ComInitializeWindowsProperty,但是“\u-DO”代码不会触发。不,在第一个例子中,VM中唯一的东西就是属性。方法和命令的创建在MainPage.Ahhh中。我会试试看。在第二个示例中,我在输出窗口中收到一条“找不到绑定的源”消息,因此显然在某个地方出现了问题。Sweeet。谢谢,第一个马上就好了。因为错误的按钮被禁用,所以我的电脑在某个地方出错;-)谢谢
<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}" />