2017-02-20 116 views
0

如何绑定在视图模型声明的属性从另一个视图模型取价值?WPF ViewModel的属性从另一个视图模型绑定

让我解释一下

我有2周的ViewModels(实现INotifyPropertyChanged)和1查看

InvoiceView(只是我的发票的设计无论是用户控制或窗口或一个DataTemplate)

InvoiceViewModel

NoteListingVM(这个视图模型有它TableRefID一个出租物业的名称)

我n个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“绑定”不能在'NoteListingVM'类型的'TableRefID'属性上设置。 '绑定'只能在DependencyObject的DependencyProperty上设置。

所以错误说,我不能使用属性。

然后我想使用一个DependencyProperty。但是,如果实现InotifyPropertyChanged,则DependencyProperty无法在ViewModel中正常工作。 (这是大多数用户在实现ViewModel时提出的建议 - “INotifyPropertychanged”)

当您有一个userControl或CustomControl时,DependencyPropertys工作正常。但这不是我的情况(我没有一个用户控件或customControl我只有一个ViewModel,我想分配/传递“参数”的NoteListingViewModel InvoiceID改变时)

所以我将如何发送InvoiceID(只xaml)到NoteListingViewModel来过滤和显示只链接到当前发票的笔记,我有前面的我?什么是正确的方式?我确定我错过了或误解了mvvm模式?

回答

1

不要那样做。改为以视图模型为中心:将NoteListingVM设置为父视图模型的属性。

而不是构建应用程序作为其自己,拼知道他们需要了解对方的ViewModels的意见一棵树,使其成为拥有自己的关系的ViewModels的树。用他们自己的视角模型来看待他们,不需要知道任何东西。

注意,当它改变了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。如果需要,您可以围绕ContentControl包装DockPanel

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

备用

你也可以写一个NotesViewUserControl有一个InvoiceID依赖属性,并绑定,在XAML。它会使用相同的NoteListingVM;您将通过DataContext属性指定该属性,就像您一直在做的那样。用户控件的InvoiceID依赖项属性将具有一个更改处理程序,该更新处理程序更新视图模型的InvoiceID,这将允许您使用绑定来设置InvoiceID。这是一种“恰当的XAML”方式来完成您原先的想法。

您也可以将NoteListingVM完全重写为UserControl,但这是更多的工作,我没有看到很多指向它的地方。

您不要将viewmodel/INotifyPropertyChanged属性与依赖项属性混合在同一个类中。

+0

aha :)我想你是对的,但是当你有这样的要求时,这是正确的方式吗?如果您将中央视图模型与其他ViewModel分开,应该不是更方便和可接受的路径吗? (或者如果他们之间有一些逻辑关系)只是想...(认为这是什么MVVM模式是和剂量)不知何故... – user2160275

+0

@ user2160275谁告诉你的?通过隐藏你的视图模型,你试图避免什么问题? –

+0

是的,我想..这是错误的吗?(纠正我),(当我们说隐藏他们,我的意思是为什么InvoiceVM需要知道我有NotesVM?) 只是我有一个视图与2 ViewModels,我希望在没有ViewModels的情况下共享它们之间的值彼此相互认识.. – user2160275

相关问题