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";
}