最佳实践是使用一个模型或一个简单的属性

本文关键字:一个 简单 属性 模型 最佳 | 更新日期: 2023-09-27 18:15:05

我正在重构一段我以前写过的代码。我编写了一个自定义usercontrol,允许用户选择对应的对象。

视图模型有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>
这意味着我在视图模型中有一个定义为 的属性
[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中定义)被更改时,此信息不会直接传播到主视图模型(这是合理的,因为它在视图模型中,因此嵌套属性不会在主视图模型中通知)。

这是ok的,或者我应该有一个SelectedCounterpart在主视图模型,通过XAML绑定它作为

并让数据上下文以某种方式由视图本身解析?

最佳实践是使用一个模型或一个简单的属性

由于并非所有上下文都可用,因此我将在这里和那里假设一些东西。

没关系,因为你实际上是在处理子虚拟机中的模型。子虚拟机只知道它拥有的模型(CounterPartModel)。如果它是相同的引用,那么您对子vm中的模型所做的更改应该直接在主vm中可见。

否则,你必须设置某种形式的通信(消息传递,服务,兴趣等)来通知其他虚拟机的变化