我有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永远不会被命中,在按钮点击时没有任何事情发生。我在这里缺少什么?
答案 0 :(得分:1)
如何建立应绑定到嵌套用户控件的VM?在视图的构造函数中?您可以通过多种方式执行此操作,我经常使用的方法是将“详细信息视图模型”公开为主VM上的属性,然后相应地设置数据上下文:
<Views:DataDetails DataContext={Binding DataDetails} />
然后你的主VM有一个属性:
public DataDetailsViewModel DataDetails { get { return _dataDetailsViewModel; } }
当然,您可以通过许多不同的方式为详细信息视图建立数据上下文,上面只是众多选项中的一种。