我正在重构我之前写过的一段代码。我编写了一个自定义用户控件,允许用户选择对应项。
viewmodel有2个属性定义为
#region Properties
[ViewToViewModel(MappingType = ViewToViewModelMappingType.TwoWayViewWins)]
public bool AllowNull
{
get { return (bool)GetValue(AllowNullProperty); }
set { SetValue(AllowNullProperty, value); }
}
public static readonly DependencyProperty AllowNullProperty = DependencyProperty.Register("AllowNull", typeof(bool),
typeof(CounterpartChooserControl), new PropertyMetadata(default(bool)));
/// <summary>
/// This Dependency property is used upon KeyDown to propagate the click to the target usercontrol
/// </summary>
public ICommandSource DestinationControl
{
get { return (ICommandSource)GetValue(DestinationControlProperty); }
set { SetValue(DestinationControlProperty, value); }
}
public static readonly DependencyProperty DestinationControlProperty = DependencyProperty.Register("DestinationControl", typeof(ICommandSource), typeof(CounterpartChooserControl),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.None));
#endregion
在视图中我需要使用它,我做了一些事情
<views4:CounterpartChooserControl Grid.Row="9" Grid.Column="1" Margin="5,2,5,2" DataContext="{Binding CounterPartModel}" >
</views4:CounterpartChooserControl>
这意味着我在viewmodel中定义了一个属性为
的属性[ViewModelToModel("Model")]
public CounterPartModel CounterPartModel
{
get { return GetValue<CounterPartModel>(CounterPartModelProperty); }
set { SetValue(CounterPartModelProperty, value); }
}
public static readonly PropertyData CounterPartModelProperty = RegisterProperty("CounterPartModel", typeof(CounterPartModel), null);
我现在面临的问题是,当SelectedItem(在CounterpartChooserViewModel中定义)被更改时,此信息不会直接传播到主视图模型(这是合理的,因为它&#39 ; s在viewmodel中,因此在主视图模型中不会通知嵌套属性。)
这可以,或者我应该在主viwemodel中有一个SelectedCounterpart,通过XAML绑定它
并通过视图本身以某种方式解析了datacontext?
答案 0 :(得分:2)
由于并非所有上下文都可用,我将在这里和那里假设一些事情。
没关系,因为你实际上正在处理子vm中的模型。子vm只知道它具有的模型(CounterPartModel)。如果它是相同的引用,则您在子vm内对模型所做的更改应直接在主vm中可见。
否则,您必须设置某种形式的通信(消息,服务,感兴趣等)以通知其他vms的更改。