最佳做法是使用模型或简单的 属性?
Best practice is to use a model or a simple property?
我正在重构一段我以前写过的代码。我写了一个自定义用户控件,它允许用户 select 对应。
视图模型有 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 将其绑定为
并由视图本身以某种方式解析数据上下文?
由于并非所有上下文都可用,我将在这里和那里假设一些事情。
没关系,因为您实际上是在子虚拟机中处理模型。子虚拟机只知道它拥有的模型 (CounterPartModel)。如果是相同的引用,那么你在子虚拟机中对模型所做的更改应该直接在主虚拟机中可见。
否则,您必须设置某种形式的通信(消息传递、服务、感兴趣等)以通知其他 vms 更改。
我正在重构一段我以前写过的代码。我写了一个自定义用户控件,它允许用户 select 对应。
视图模型有 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 将其绑定为
并由视图本身以某种方式解析数据上下文?
由于并非所有上下文都可用,我将在这里和那里假设一些事情。
没关系,因为您实际上是在子虚拟机中处理模型。子虚拟机只知道它拥有的模型 (CounterPartModel)。如果是相同的引用,那么你在子虚拟机中对模型所做的更改应该直接在主虚拟机中可见。
否则,您必须设置某种形式的通信(消息传递、服务、感兴趣等)以通知其他 vms 更改。