![](/img/trans.png)
[英]How do you bind user control properties to properties of an observable object contained in observable collection
[英]How to bind to a collection contained in an other project/namespace?
我这样做:
this.combobox.ItemsSource = Common.Component.ModuleManager.Instance.Modules;
将组合框绑定到另一个项目/命名空间中的集合。 但是我不得不将ComboBox
移到DataTemplate中。
现在我需要做这样的事情:
<ComboBox ItemsSource="{Binding Common.Component.ModuleManager.Instance.Modules}"/>
我不想列出所有尝试,但都没有成功。
还有更好的主意吗?
您需要将.NET命名空间映射到XAML文件顶部的XML命名空间:
<Window
x:Class="WindowsApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:q="clr-namespace:Common.Component">
因此,现在“ q”被映射到“ Common.Component”名称空间。 现在,您可以使用x:Static标记扩展名来访问ModuleManager类的静态“实例”属性:
<ComboBox
ItemsSource="{Binding Modules,Source={x:Static q:ModuleManager.Instance}}" />
看看是否适合您。
编辑
还有一件事:如果您的“ Common.Component”命名空间位于单独的程序集中,则需要告诉XAML:
xmlns:q="clr-namespace:Common.Component;assembly=CommonAssemblyFilename"
无关紧要的是,您可能希望绑定到Observable集合,以提高性能。 这里有更多WPF优化细节。
将IEnumerable绑定到ItemsControl会强制WPF创建包装IList <(Of <(T>)>)对象,这意味着第二个对象的不必要开销会影响您的性能。
好的,我找到了解决方法。 如果集合包含在另一个程序集中,则一定存在问题。
我在XAML和Binding的程序集中添加了一个新类。
public static class ResourceHelper
{
public static IEnumerable<Common.Component.Module> Modules = Common.Component.ModuleManager.Instance.Modules;
}
然后我将绑定更改为
<ComboBox ItemsSource="{Binding Path=.,Source={x:Static e:ResourceHelper.Modules}}"/>
这很好。
Thx Matt的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.