【问题标题】:MainWindow and UserControl, event handling on user controlMainWindow 和 UserControl,用户控件上的事件处理
【发布时间】:2014-01-06 16:08:05
【问题描述】:

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

<Views:DataDetails />

MainWindow 和 DataDetails 都使用视图模型,我想保持代码隐藏不变。所以我使用命令进行事件处理,但我对这种方法有疑问。 MainWindow 上的单击事件正常工作,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 中我添加了带有 &lt;Views:DataDetails /&gt; 的 DataDetails 用户控件,在窗口标记元素中我添加了这个命名空间,所以这个用户控件在 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 时永远不会被击中,在按钮单击时没有任何反应。我在这里缺少什么?

【问题讨论】:

  • 在哪里设置 DataDetails DataContext 为 DataDetailsViewModel? DataDetailsViewModel 是 MainWindowViewModel 的属性吗?

标签: c# .net wpf


【解决方案1】:

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

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

然后你的主虚拟机有一个属性:

public DataDetailsViewModel DataDetails { get { return _dataDetailsViewModel; } }

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

【讨论】:

    猜你喜欢
    • 2018-11-07
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2010-11-08
    相关资源
    最近更新 更多