gpt4 book ai didi

.net - XAML 标记绑定(bind)到具有 Type 类型键的字典

转载 作者:行者123 更新时间:2023-12-03 02:25:12 25 4
gpt4 key购买 nike

我正在尝试绑定(bind)到 Dictionary<Type,string>通过xaml。

问题是,索引器 []Binding标记扩展将其内容解释为字符串。对于这种情况是否有某种“转义序列”?

<TextBox Text="{Binding theDictionary[{x:Type ns:OnePrettyType}]}" />

(绑定(bind)不起作用,因为 {x:Type ns:OnePrettyType} 正在作为字符串发送)

最佳答案

如果索引器具有特定类型,则应自动完成转换,因此这应该有效:

{Binding theDictionary[ns:OnePrettyType]}

如果您需要明确的解释,您可以尝试像这样的“强制转换”:

{Binding theDictionary[(sys:Type)ns:OnePrettyType]}

(其中 sys 当然映射到 System 命名空间)

这就是理论,但所有这些都行不通。首先,如果您使用采用路径的 Binding 构造函数,则强制转换将被忽略,因为它使用 PropertyPath 的特定构造函数。以某种方式。此外,您还会收到绑定(bind)错误:

System.Windows.Data Error: 40 : BindingExpression path error: '[]' property not found on 'object' ''Dictionary`2'

您需要使其通过类型转换器构造 PropertyPath,避免使用 Binding 构造函数:

{Binding Path=theDictionary[(sys:Type)ns:OnePrettyType]}

现在这很可能只会引发异常:

{"Path indexer parameter has value that cannot be resolved to specified type: 'sys:Type'"}

不幸的是,没有进行默认类型转换。然后,您可以在 XAML 中构造一个 PropertyPath 并确保传入类型,但该类并不意味着在 XAML 中使用,并且如果您尝试,将会抛出异常,这也是非常不幸的。

一种解决方法是创建一个标记扩展来进行构建,例如

[ContentProperty("Parameters")]
public class PathConstructor : MarkupExtension
{
public string Path { get; set; }
public IList Parameters { get; set; }

public PathConstructor()
{
Parameters = new List<object>();
}
public PathConstructor(string path, object p0)
{
Path = path;
Parameters = new[] { p0 };
}

public override object ProvideValue(IServiceProvider serviceProvider)
{
return new PropertyPath(Path, Parameters.Cast<object>().ToArray());
}
}

然后可以像这样使用:

<Binding>
<Binding.Path>
<me:PathConstructor Path="theDictionary[(0)]">
<x:Type TypeName="ns:OnePrettyType" />
</me:PathConstructor>
</Binding.Path>
</Binding>

或者像这样

{Binding Path={me:PathConstructor theDictionary[(0)], {x:Type ns:OnePrettyType}}}

关于.net - XAML 标记绑定(bind)到具有 Type 类型键的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9371469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com