Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用SoapBox将数据从视图绑定到UserControl_C#_Wpf_User Controls_Mef - Fatal编程技术网

C# 如何使用SoapBox将数据从视图绑定到UserControl

C# 如何使用SoapBox将数据从视图绑定到UserControl,c#,wpf,user-controls,mef,C#,Wpf,User Controls,Mef,我有我的肥皂盒。文件“登记” [Export(SoapBox.Core.ExtensionPoints.Workbench.Documents, typeof(IDocument))] [Export(CompositionPoints.Workbench.Documents.Register, typeof(Register))] [Document(Name = DOC_NAME)] class Register : AbstractDocument { public Receip

我有我的肥皂盒。文件“登记”

[Export(SoapBox.Core.ExtensionPoints.Workbench.Documents, typeof(IDocument))]
[Export(CompositionPoints.Workbench.Documents.Register, typeof(Register))]
[Document(Name = DOC_NAME)]

class Register : AbstractDocument
{
    public Receipt actualReceipt;
    private const string DOC_NAME = "Register";
    public Register()
    {
        Name = DOC_NAME;
        Title = "Recipe Document Title";
        SomeProperty = "Hello from the recipe document!";
    }
}
在本文档中,我想使用用户控件,这些控件是一种自己的“视图” 类似于所有接收位置的列表视图

所以现在我拿到了我的模型收据和收据位置

class ReceiptPosition
{
    public int Id { get; set; }
    //public Receipt Receipt { get; set; } using for Database 
    public int Position { get; set; }
    public string Article { get; set; }
}
模型收据

class Receipt
{
    public int Id { get; set; }
    public string Receiptnumber { get; set; }
    public IList<ReceiptPositions> ReceiptPositions { get; set; }
现在我想添加一个UserControl,它显示在ReceiptPositions中的所有文章的列表

但是,如何绑定数据,以便在接收中将新的ReceiptPosition添加到IList时,UserControl会自动“刷新”

这是我需要的一个直观的例子


为此,您可以使用
ItemsControl

xaml:


政务司司长:

private receive\u myreceive;
公共收据MyReceived{get{return}MyReceived;}set{{MyReceived=value;OnPropertyChanged(“MyReceived”);}
公共主窗口()
{
初始化组件();
DataContext=this;
MyReceipt=新收据{ReceiptPositions=新的ObservableCollection()};
MyReceipt.ReceiptPositions.Add(新的ReceiptPosition{Article=“Foo”});
MyReceipt.ReceiptPositions.Add(新的ReceiptPosition{Article=“Bar”});
MyReceipt.ReceiptPositions.Add(新的ReceiptPosition{Article=“Baz”});
MyReceipt.ReceiptPositions[0]。Article=“Frabazamataz”;
}
说明:

ItemsControl允许您将列表绑定到其ItemsSource属性,以用作DataTemplate创建的每个视图的DataContext

Observable集合在添加、删除或更改每个项目时自动提供PropertyChange通知


这允许您仅根据您的数据创建一个非常灵活的项目列表。

死亡的答案是正确的,即您使用数据模板。如果视图和数据模板位于MEF插件中,则需要导入将视图模型映射到视图的插件和数据模板。在你发布的另一个问题中,很明显你试图导出你的插件用户控件…我个人认为这有点误导。如果您的主应用程序使用MVVM,那么您的插件也应该使用MVVM。在这种情况下,插件应该导出一个IPlugin类,并指定一个将其映射到视图的数据模板。正如我在另一页上指出的,数据模板也必须导入,以便您可以将其添加到全局资源中

我已经创建了一个项目,使用您在uother问题中提供的类来展示这一点。要查看的要点是插件项目中的数据模板,以及在主项目中导入内容的两个位置

请注意,在我的演示中,我要求每个插件为其视图和视图模型显式指定一个DataTemplate,但您可能不想这样做,因此我还在App.xaml.cs底部添加了一段注释掉的代码,说明了如何避免这种情况(为了使其正常工作,我必须将视图类型添加到IPlugData类中,但这只适用于这个示例)。如果您选择手动创建数据模板,那么插件不需要指定数据模板,也不需要保存它们的自定义ResourceDictionary


如果您有问题,请随时在评论中发帖。

谢谢您的回答,但这不是我真正想要的。正如我所写的,我使用MEF(在SoapBoxCore框架中)UserControl是一个自己的类,可以导入,然后应该绑定主机上的数据。@MarkFeldman?你有选择吗?嘿@MarkFeldman,我想我们已经讨论过了。我只想将UserControl添加为视图,而不是数据模板。因为我想添加一个视图,它可以显示主机应用程序中的数据在上。我希望能够为我的用户提供一个dll,他们可以使用该dll以不同的方式显示数据。我在问题中添加了一个可视化示例。希望能有所帮助。:)我不知道这一提及是否有效。。有时它会让我看到你的名字。。有时候不是。@bene_raw好吧,我创建的项目几乎就是你需要的。我将用户控件类型添加到元数据中,然后使用它创建一个DataTemplate。与其创建DataTemplate,不如调用创建该类型的实例,将其DataContext设置为数据,并将其添加为父窗口的子控件。
private Receipt _myReceipt;
public Receipt MyReceipt { get { return _myReceipt; } set { _myReceipt = value; OnPropertyChanged("MyReceipt"); } } 

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
    MyReceipt = new Receipt { ReceiptPositions = new ObservableCollection<ReceiptPosition>() };

    MyReceipt.ReceiptPositions.Add(new ReceiptPosition { Article = "Foo" });
    MyReceipt.ReceiptPositions.Add(new ReceiptPosition { Article = "Bar" });
    MyReceipt.ReceiptPositions.Add(new ReceiptPosition { Article = "Baz" });

    MyReceipt.ReceiptPositions[0].Article = "Frabazamataz";
}