繁体   English   中英

如何绑定到其他项目/名称空间中包含的集合?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM