【发布时间】:2016-07-29 17:44:49
【问题描述】:
我有一个视图,上面有 2 个子视图,每个视图都分配了一个 ViewModel:
ViewParent - ViewModelParent
{
ViewA - ViewModelA
ViewB - ViewModelB
}
ViewParent 结构如下所示。
<StackPanel Orientation="Vertical">
<local:AView DataContext="{Binding ViewModelA, Mode=TwoWay}"></localViews:AView>
</StackPanel>
<StackPanel Orientation="Vertical">
<localViews:BView DataContext="{Binding ViewModelB, Mode=TwoWay}"></localViews:BView>
</StackPanel>
现在在ViewA 后面的代码中,我有一个事件来选择gridview 中的一行。
private void radGridView_SelectionChanged(object sender, SelectionChangeEventArgs e)
{
try
{
RadGridView grv = sender as RadGridView;
if (e.AddedItems.Count > 0)
{
var row = grv.SelectedItem as SomeClass;
if(condition)
// Enable a button in ViewB.
我想要的是将row 传递给ViewModelB。另外,我想在 ViewB 中启用一个按钮。最后我想从ViewModelA 传递几个整数到ViewModelB。
怎么做?我想过构造函数注入,但仍然没有明确的想法。
【问题讨论】:
-
ViewModelParent 应该有对每个子虚拟机的引用,对吧?所以给 vmA 一个 SelectedRow 属性,带有
PropertyChanged,并在 ViewA 中绑定它。给 vmA 一个 SelectedRowChanged 事件。选定的行更改时会提高它。 ViewModelParent 在创建 vmA 时为该事件设置处理程序,并在处理程序中设置 vmB 上的属性,如bool CanDoWhatever。CanDoWhatever启用按钮绑定的命令,并看到该命令的 CanExecuteChanged 事件已引发。 -
@EdPlunkett,是的。 ViewModelParent 确实有对每个子虚拟机的引用。并且 VmA 已经有一个带有
PropertyChanged的 SelectedItem 属性。我不确定我能在 VmB 中做的其他事情。 -
使用您拥有的工具做任何事情。也许给 vmB 一个属性
bool IsMyPuppyDogButtonEnabled { get; set; },它会引发 PropertyChanged。让父 vm 在 XAMLIsEnabled="{Binding IsMyPuppyDogButtonEnabled}"中的 Button 上适当地设置该属性。有一百万种方法可以做到这一点。底线:视图模型管理它们之间的状态。视图坐在那里观察其视图模型的属性,并响应这些属性的变化。 -
@EdPlunkett,我看到了关于绑定按钮属性的信息。对于 SelectedRow 属性,如何将其传递给 ViewModelB?使用构造函数?