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



我有MainWindow和DataDetails用户控件。DataDetails显示在窗口右侧的MainWindow中,并使用xaml 进行渲染

<Views:DataDetails />

MainWindow和DataDetails都使用视图模型,我希望保持代码绑定不变。所以我使用命令来处理事件,但我对这种方法有问题。MainWindow上的点击事件正常工作,DataDetails上的相同方法不工作,这是代码

主窗口.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中,我将按钮单击事件连接到命令SaveDataCommand,并在DataDetailsViewModel中命令自身。

数据详细信息.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时,永远不会点击,在按钮上单击不会发生任何事情。我在这里缺少什么?

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

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

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

public DataDetailsViewModel DataDetails { get { return _dataDetailsViewModel; } }

当然,有很多不同的方法可以为详细信息视图建立数据上下文,以上只是众多选项之一。

最新更新