来自另一个ViewModel的wpf ViewModel属性绑定

来自另一个ViewModel的wpf ViewModel属性绑定,wpf,properties,binding,viewmodel,Wpf,Properties,Binding,Viewmodel,如何绑定viewmodel中声明的属性以从另一个viewmodel获取值 让我解释一下 我有2个视图模型(实现INotifyPropertyChanged)和1个视图 InvoiceView(无论是用户控件、窗口还是数据模板,都只是我的发票设计) 发票视图模型 NoteListingVM(此viewmodel有一个属性,我们将其命名为TableRefID) 在ViewInvoice中,我有一个将其dataContext设置为(NoteListingVM)的扩展器,用于显示与特定invoiceID

如何绑定viewmodel中声明的属性以从另一个viewmodel获取值

让我解释一下

我有2个视图模型(实现INotifyPropertyChanged)和1个视图

InvoiceView(无论是用户控件、窗口还是数据模板,都只是我的发票设计)

发票视图模型

NoteListingVM(此viewmodel有一个属性,我们将其命名为TableRefID)

在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>

无法在“NoteListingVM”类型的“TableRefID”属性上设置“Binding”。只能对DependencyObject的DependencyProperty设置“绑定”

正如错误所说,我不能使用属性

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

当您有userControl或CustomControl时,DependencyProperty可以很好地工作。但这不是我的情况(我没有usercontrol或customControl,我只有一个ViewModel,我想在InvoiceID更改时将“参数”分配/传递给NoteListingViewModel)


那么,我将如何将InvoiceID(仅xaml)发送到NoteListingViewModel以过滤并仅显示链接到当前发票的注释呢?正确的方法是什么?我确信我遗漏了或误解了mvvm模式

不要那样做。改为以viewmodel为中心:将
NoteListingVM
作为父viewmodel的属性

不要将应用程序结构化为视图树,视图树拥有视图模型,视图模型很难了解彼此需要了解什么,而是将应用程序结构化为视图模型树,视图模型拥有自己的关系。用除了他们自己的视图模型之外不需要知道任何东西的视图来装饰他们

请注意,下面的
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>

候补 您还可以编写一个具有
InvoiceID
依赖属性的
NotesView
UserControl
,并将其绑定到XAML中。它将使用相同的
NoteListingVM
;您可以通过
DataContext
属性指定它,就像您一直在做的那样。用户控件的
InvoiceID
依赖项属性将具有更新viewmodel的
InvoiceID
的更改处理程序,这将允许您使用绑定来设置
InvoiceID
。这是一种“适当的XAML”方法,可以实现您最初的想法

您也可以将
NoteListingVM
完全重写为
UserControl
,但这需要更多的工作,我看不出有什么意义


不能将viewmodel/
INotifyPropertyChanged
属性与同一类中的依赖项属性混合使用

不要那样做。改为以viewmodel为中心:将
NoteListingVM
作为父viewmodel的属性

不要将应用程序结构化为视图树,视图树拥有视图模型,视图模型很难了解彼此需要了解什么,而是将应用程序结构化为视图模型树,视图模型拥有自己的关系。用除了他们自己的视图模型之外不需要知道任何东西的视图来装饰他们

请注意,下面的
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>

候补 您还可以编写一个具有
InvoiceID
依赖属性的
NotesView
UserControl
,并将其绑定到XAML中。它将使用相同的
NoteListingVM
;您可以通过
DataContext
属性指定它,就像您一直在做的那样。用户控件的
InvoiceID
依赖项属性将具有更新viewmodel的
InvoiceID
的更改处理程序,这将允许您使用绑定来设置
InvoiceID
。这是一种“适当的XAML”方法,可以实现您最初的想法

您也可以将
NoteListingVM
完全重写为
UserControl
,但这需要更多的工作,我看不出有什么意义


不能将viewmodel/
INotifyPropertyChanged
属性与同一类中的依赖项属性混合使用

啊哈:)我想你是对的,但是当你有这样的要求时,这是正确的方法吗?如果将中心视图模型与其他视图模型分开,这难道不是更方便、更容易接受的路径吗?(或者他们之间是否有某种逻辑)只是思考。。(以为这就是MVVM模式和剂量)不知怎的…@user2160275谁告诉你的?通过相互隐藏视图模型,您试图避免什么问题?是的,我想。。这是错误的吗?(纠正我)(当我们说隐藏它们时,我的意思是为什么InvoiceVM需要知道我有NotesVM?)简单地说,我有一个包含2个ViewModels的视图,我希望它们之间共享值,而ViewModels彼此不了解。@user2160275我刚刚纠正了你。如果你不想听,那是你的选择。祝你好运。啊哈:)我想你是对的,但是当你有这样的要求时,这是正确的方法吗?如果将中心视图模型与其他视图模型分开,这难道不是更方便、更容易接受的路径吗?(如果他们之间有某种逻辑