2017-02-20 89 views
0

Как связать свойство, объявленное в режиме просмотра, для получения значения из другого viewModel?wpf ViewModel Property Binding с другой viewmodel

позвольте мне объяснить

у меня есть 2 ViewModels (Реализует INotifyPropertyChanged) и 1 Вид

InvoiceView (только мой дизайн счета независимо от того, если это пользовательский элемент управления или окно или DataTemplate)

InvoiceViewModel

NoteListingVM (это ViewModel имеет имя свойство ДАВАЙТЕ он TableRefID)

I п ViewInvoice я быть_наст расширитель с его DataContext установлен в положении (NoteListingVM), чтобы показать некоторые заметки, которые связаны с конкретным InvoiceID

У меня есть проблема, когда я попробовать следующий

<Expander Header="NOTES" DockPanel.Dock="Top" Foreground="{StaticResource AlternateForeGround}"> 
        <DockPanel> 
         <DockPanel.DataContext> 
          <WendBooks:NoteListingVM TableRefID="{Binding InvoiceID}" x:Name="TransactionNotes"></WendBooks:NoteListingVM> 
         </DockPanel.DataContext> 

A «Связывание» не может быть задано в свойстве «TableRefID» типа «NoteListingVM». «Связывание» может быть установлено только на DependencyProperty объекта DependencyObject.

, так как ошибка говорит, я не могу использовать свойство.

Тогда я думаю использовать DependencyProperty. Но DependencyProperty не может нормально работать в ViewModels, если вы реализуете InotifyPropertyChanged. (и это то, что большинство пользователей предлагают при реализации ViewModel - «INotifyPropertychanged»)

DependencyProperty работают хорошо, когда у вас есть пользовательский контроль или пользовательский контроль. Но это не мой случай (у меня нет usercontrol или customControl i, у меня есть ViewModel, который я хочу назначить/передать «параметр» в NoteListingViewModel при изменении InvoiceID)

так как я буду отправлять InvoiceID (только xaml) в NoteListingViewModel для фильтрации и отображения только заметок, которые связаны с текущим счетом, который у меня впереди? Каков правильный путь? я уверен, что я пропустил или неправильно понял шаблон mvvm?

ответ

1

Не делайте этого. Сделайте это с помощью viewmodel-centric: вместо этого сделайте NoteListingVM свойство родительской модели.

Вместо того, чтобы структурировать ваше приложение как дерево представлений, которые имеют собственные модели просмотра, которые борются за то, чтобы знать, что им нужно друг к другу, сделать это деревом моделей, которые владеют своими собственными отношениями. Назовите их взглядами, которые не нужно знать ни о чем, кроме их собственных моделей взглядов.

Обратите внимание: InvoiceID нижеуказанных обновлений Notes.InvoiceID при изменении. Проще простого.

public MyViewModel() 
{ 
    Notes = new NoteListingVM(); 
} 

private int _invoiceID = 0; 
public int InvoiceID 
{ 
    get { return _invoiceID; } 
    set 
    { 
     if (value != _invoiceID) 
     { 
      _invoiceID = value; 
      Notes.InvoiceID = this.InvoiceID; 
      OnPropertyChanged(); 
     } 
    } 
} 

private NoteListingVM _notes = null; 
public NoteListingVM Notes 
{ 
    get { return _notes; } 
    protected set 
    { 
     if (value != _notes) 
     { 
      _notes = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

XAML. Вы можете обернуть DockPanel вокруг ContentControl, если хотите.

<Expander 
    Header="NOTES" 
    DockPanel.Dock="Top" 
    Foreground="{StaticResource AlternateForeGround}" 
    > 
    <ContentControl Content="{Binding Notes}" /> 
</Expander> 

Alternate

Вы также можете написать NotesViewUserControl, что имеет свойство в InvoiceID зависимостей и связать, что в XAML.Он будет использовать то же самое NoteListingVM; вы должны назначить это через свойство DataContext так же, как вы делали. У свойства зависимостей пользователя InvoiceID был бы обработчик изменений, который обновляетviewmodel, который позволит вам использовать привязку для установки InvoiceID. Это «правильный XAML» способ сделать то, что вы изначально имели в виду.

Вы также можете полностью переписать NoteListingVM как UserControl, но это больше работы, и я не вижу в этом большого смысла.

Вы не смешиваете свойства viewmodel/INotifyPropertyChanged с зависимыми свойствами в том же классе.

+0

aha :) Я думаю, вы правы, но это правильный способ следовать, когда у вас есть такое требование? не должен быть более удобным и приемлемым путем, если вы сохраните свою центральную модель просмотра отдельно от других ViewModels? (или если у них есть какая-то логика между ними или нет), просто думая .. (думал, что это то, что шаблон MVVM и доза.) как-то ... – user2160275

+0

@ user2160275 Кто вам сказал? Какую проблему вы пытаетесь избежать, скрывая свои режимы просмотра друг от друга? –

+0

Да, я думаю .. это неправильно? (Исправьте меня), (когда мы говорим, что скрываем их, я имею в виду, почему InvoiceVM должен знать, что у меня есть NotesVM?) просто у меня есть представление с 2 ViewModels, и я ожидаю доля значений между ними без ViewModels знают друг друга. – user2160275

 Смежные вопросы

  • Нет связанных вопросов^_^