最佳实践是使用模型还是简单属性?

Posted

技术标签:

【中文标题】最佳实践是使用模型还是简单属性?【英文标题】:Best practice is to use a model or a simple property? 【发布时间】:2015-09-29 08:21:15 【问题描述】:

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

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>

这意味着我在视图模型中有一个属性定义为

[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 中定义)发生更改时,此信息不会直接传播到主视图模型(这是合理的,因为它位于视图模型内,因此嵌套属性不会在主视图模型中通知)。

这样可以吗,或者我应该在主 viwemodel 中有一个 SelectedCounterpart,通过 XAML 将它绑定为

视图本身是否以某种方式解析了数据上下文?

【问题讨论】:

请同时指定虚拟机类型名称。没有足够的上下文。 【参考方案1】:

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

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

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

【讨论】:

以上是关于最佳实践是使用模型还是简单属性?的主要内容,如果未能解决你的问题,请参考以下文章

使用视图模型中的属性值实现方法的最佳实践是啥?

使用 Core Data 在视图中引用模型对象的最佳实践是啥?

Ext.define() 中有关 initComponent() 的最佳实践

ASP.NET MVC 4,EF5,模型中的唯一属性 - 最佳实践?

创建数据模型的最佳实践 [关闭]

通过视图模型接收 DateTime 输入的最佳实践是啥?