MainWindow和UserControl,用户控件上的事件处理

时间:2014-01-06 16:08:06

标签: c# .net wpf

我有MainWindow和DataDetails用户控件。 DataDetails显示在窗口右侧的MainWindow内,并使用xaml

进行渲染
<Views:DataDetails />

MainWindow和DataDetails都使用视图模型,我希望保持代码隐藏不变。所以我使用命令进行事件处理,但我对这种方法有疑问。 MainWindow上的Click事件工作正常,DataDetails上的相同方法不起作用,这里是代码

MainWindow.xaml

...
<Button Name="btnSearch" 
        Command="{Binding  SearchByCommand, Mode=OneWay}"> Search </Button>

MainWindowViewModel.cs

public ICommand SearchByCommand
{
    get
    {
       if (_SearchByCommand == null)
       {
           _SearchByCommand = new RelayCommand(
              x => this.LoadData(this.SearchBy),
              x => { return !string.IsNullOrEmpty(this.SearchText); }
          );
       }
       return _SearchByCommand;
    }
 }

这里没有显示LoadData方法来减少代码量,这也是在MainWindow中工作的。

在MainWindow.xaml内部我已经使用<Views:DataDetails />添加了DataDetails用户控件,在window标签元素中我添加了这个命名空间,因此这个用户控件在MainWindow中正确显示。在DataDetails中,我将按钮点击事件连接到Command SaveDataCommand并在DataDetailsViewModel中命令自己。

DataDetails.xaml

<Button Name="btnSave" 
            Command="{Binding  SaveDataCommand, Mode=OneWay}"> Save data</Button>

DataDetailsViewModel

public ICommand SaveDataCommand
{
    get
    {
        _SaveDataCommand = new RelayCommand(
             x=>this.SaveData(), null);
             return _SaveDataCommand;
    }            
}

此处未显示此方法(SaveData)以减少代码量。在调试时,此SaveDataCommand永远不会被命中,在按钮点击时没有任何事情发生。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

如何建立应绑定到嵌套用户控件的VM?在视图的构造函数中?您可以通过多种方式执行此操作,我经常使用的方法是将“详细信息视图模型”公开为主VM上的属性,然后相应地设置数据上下文:

<Views:DataDetails DataContext={Binding DataDetails} />

然后你的主VM有一个属性:

public DataDetailsViewModel DataDetails { get { return _dataDetailsViewModel; } }

当然,您可以通过许多不同的方式为详细信息视图建立数据上下文,上面只是众多选项中的一种。