gpt4 book ai didi

xaml - 通过 XAML 整齐地填充 IEnumerable?

转载 作者:行者123 更新时间:2023-12-04 01:38:33 24 4
gpt4 key购买 nike

我正在尝试从 XAML 填充依赖项属性。依赖属性是 IEnumerable<KeyAction>其中 KeyAction 是一个复杂类型。

<loc:MyType.KeyActions>
<loc:KeyAction Action="Show" Key="Space" Modifiers="LeftCtrl" />
<loc:KeyAction Action="Hide" Key="Escape" />
</loc:MyType.KeyActions>

现在,这会导致 KeyAction属性要“声明两次”,因为 XAML 将每个项目解释为属性的候选对象,而不是列表中的项目。

为此,它需要看起来像:
<loc:CompletionPopupView.KeyActions>
<sys:List`KeyAction>
<loc:KeyAction Action="Show" Key="Space" Modifiers="LeftCtrl" />
<loc:KeyAction Action="Hide" Key="Escape" />
</sys:List`KeyAction>
</loc:CompletionPopupView.KeyActions>

而且我需要添加命名空间,如果可行的话,通用语法可能更糟糕。有什么方法可以使第一个示例起作用吗?

最佳答案

有两种不同的方法可以完成这项工作。一个看起来与您的第一个示例完全一样,但需要更改您的类(class)并且不会按照您要求的方式运行(这对您来说可能是也可能不是问题);其他行为与您要求的完全一样,但更冗长。您可以决定哪一种更适合您。

选项 1:添加到集合

XAML 具有用于初始化集合的神奇速记语法,使用您在第一个示例中显示的确切语法。但是,它仅在属性类型实现 IList 时才有效。 . (是的,这确实是非泛型 IList——虽然通常没什么大不了的,.NET 附带的所有泛型集合都实现了 IList<T>IList。)

所以你可以做你的第一个例子,但前提是你的 KeyActions属性被声明为实现 IList 的类型.例如,您可以将您的属性更改为:

public ObservableCollection<KeyAction> KeyActions { get {...} }

然后只需将多个子元素放入您的属性中,它就会将它们添加到集合中:
<loc:MyType.KeyActions>
<loc:KeyAction Action="Show" Key="Space" Modifiers="LeftCtrl" />
<loc:KeyAction Action="Hide" Key="Escape" />
</loc:MyType.KeyActions>

但是,这与您要求的不太一样,因为 XAML 不会创建新集合——它会添加到现有集合中。因此,如果您选择此选项,您的类需要在其构造函数( KeyActions = new ObservableCollection<KeyAction>(); )中实例化集合,以便在您开始尝试 Add 时不会收到空引用异常。元素。

选项 2:创建新集合

如果您确实需要创建一个新集合并将其分配给您的属性(property),那也是可行的。不幸的是,XAML2006(WPF 仍在使用的风格)仅支持整个文档的根元素上的泛型——因此您无法实例化 List<T>并将其分配给一个属性。

不过没关系;您可以使用与 WPF 相同的解决方法。只需创建您自己的非泛型类,该类来自泛型列表。
public class KeyActionCollection : ObservableCollection<KeyAction> {}

然后你可以在 XAML 中实例化它:
<loc:CompletionPopupView.KeyActions>
<loc:KeyActionCollection>
<loc:KeyAction Action="Show" Key="Space" Modifiers="LeftCtrl" />
<loc:KeyAction Action="Hide" Key="Escape" />
</loc:KeyActionCollection>
</loc:CompletionPopupView.KeyActions>

如果您选择此选项,您可以将您的属性(property)声明为 IEnumerable<KeyAction>如果你愿意。自定义列表仅用于从 XAML 填充列表。

你甚至可以结合这两种方法:使属性读/写和类型 KeyActionCollection ,在您的构造函数中实例化它,然后XAML 可以选择是使用速记语法添加到现有集合中,还是创建一个新集合;和运行时代码可以做出相同的选择。

关于xaml - 通过 XAML 整齐地填充 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10376001/

24 4 0