2015-07-21 2 views
1

Я создал пользовательский элемент управления, состоящий из автозаполнения с выбранным элементом ... до сих пор я реализовал его так, как мне не нравится ... Я имею в виду, ve вид XAML, Viewmodel и в режиме просмотра я загружаю данные из хранимой процедуры. Поскольку окно автозаполнения является сторонним UserControl, я добавил его в представление XAML и не определялся как пользовательский пользовательский контроль. Какая практика? Я думаю, что сейчас тот факт, что я использую Catel в MVVM Framework является irrilevant ..Пользовательский пользовательский контроль с MVVM и Catel

Благодаря

UPDATE # 1

Мои элементы управления UserControl должны иметь некоторые свойства, которые передаются с помощью XAML, например, (LoadDefaultValue)

<views:PortfolioChooserView x:Name="PortfolioChooserView" DataContext="{Binding Model.PortfolioModel}" Height="25" LoadDefaultValue="True" Width="150" /> 

для достижения такого сценария, который я должен был определить свойство зависимостей в моем PortfolioChooserView определяются как

public bool LoadDefaultValue 
    { 
     get { return (bool)GetValue(LoadDefaultValueProperty); } 
     set { SetValue(LoadDefaultValueProperty, value); } 
    } 

    public static readonly DependencyProperty LoadDefaultValueProperty = DependencyProperty.Register(
    "LoadDefaultValue", typeof(bool), typeof(PortfolioChooserView), new PropertyMetadata(default(bool))); 

Поскольку, если бы я определил его в Viewmodel, я бы не смог его установить.

Самое странное в том, что для того, чтобы передать его в ViewModel я должен был сделать такой трюк

public PortfolioChooserView() 
    { 
     InitializeComponent(); 
     if (!isFirstLoad) return; 

     Focusable = true; 
     PortfolioCompleteBox.AllowDrop = true; 
     PortfolioCompleteBox.Focus(); 

     DragDropManager.AddPreviewDragOverHandler(PortfolioCompleteBox, OnElementDragOver); 
     DragDropManager.AddDropHandler(PortfolioCompleteBox, OnElementDrop); 

     DataContextChanged += PortfolioChooserView_DataContextChanged; 
     isFirstLoad = false; 
    } 

    void PortfolioChooserView_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var dataContext = DataContext as PortfolioModel; 

     if (dataContext != null) 
     { 
      dataContext.LoadDefaultValue = LoadDefaultValue; 
      dataContext.AllowNull = AllowNull; 

      //var converter = new PortfolioConverter(); 

      //var portfolio = (Portfolio) converter.Convert(SelectedItem, null, null, CultureInfo.CurrentCulture); 
      //dataContext.SelectedItem = portfolio; 
     } 
    } 

Но мне действительно не нравится использовать событие DataContextChanged ... Видите ли вы лучший подход? Спасибо

UPDATE # 2

Я держу это toghether, поскольку это родственный вопрос ... На некоторых ViewModel я использовал DeferValidationUntilFirstSaveCall = истина; в конструкторе отключить проверку при загрузке, но мои пользовательские элементы управления показывают красную рамку вокруг ... что мне делать, чтобы распространять эту информацию во вложенные usercontrols?

enter image description here

Еще раз спасибо

ответ

1

См Orc.Controls тонн для примеров. Это библиотека с открытым исходным кодом, в которой есть много пользовательских элементов управления, построенных с помощью Catel, даже с автозаполнением.

+0

Я посмотрел на них, и они очень похожи на мои .. У меня только один вопрос, и именно поэтому я открыл эту тему ... см. Мое обновление, пожалуйста, – advapi

+0

Вы проверили материал ViewToViewModel (это также в демках)? –

+0

Я нахожусь в этом я отсутствовал атрибут [ViewToViewModel (MappingType = ViewToViewModelMappingType.TwoWayViewWins)]! – advapi