2015-09-29 3 views
1

Я рефакторинг фрагмента кода, который я написал несколько раз назад. Я написал пользовательский элемент управления, который позволяет пользователю выбирать партнера.Лучшей практикой является использование модели или простого свойства?

модели представления имеет 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), эта информация напрямую не распространяется на основную модель представления (и это разумно, так как она находится внутри модели представления, и поэтому вложенное свойство не уведомляется в главной модели просмотра).

Это нормально, или я должен иметь SelectedCounterpart в главном viwemodel, привязать его с помощью XAML, как

и имеет DataContext решить как-то сам видом?

+0

Укажите также имена типов vm. Недостаточно контекста. –

ответ

2

Поскольку не все условия доступны, я собираюсь предположить несколько вещей здесь и там.

Это нормально, потому что вы фактически управляете моделью внутри sub vm. Sub vm ​​знает только о модели, которую он имеет (CounterPartModel). Если это та же ссылка, то изменения, которые вы делаете для модели внутри sub vm, должны быть непосредственно видны в главном vm.

В противном случае вам необходимо настроить какую-либо связь (обмен сообщениями, услуги, заинтересованность и т. Д.), Чтобы уведомить другие изменения vms.