gpt4 book ai didi

WPF 派生 ComboBox SelectedValuePath 问题

转载 作者:行者123 更新时间:2023-12-04 23:30:59 29 4
gpt4 key购买 nike

在我们的应用程序中,我们有一个非常大的数据集,用作 ComboBox 列表等的数据字典。这些数据是静态缓存的,并与 2 个变量绑定(bind),所以我认为编写一个派生自的控件是明智的ComboBox 并将 2 个键公开为 DP。当这 2 个键具有正确的值时,我会从它对应的数据字典列表中自动设置 ComboBox 的 ItemsSource。我还自动将构造函数中的 SelectedValuePath 和 DisplayMemberPath 分别设置为代码和描述。

以下是数据字典列表中 ItemsSource 中的项目始终看起来如何的示例:

public class DataDictionaryItem
{
public string Code { get; set; }
public string Description { get; set; }
public string Code3 { get { return this.Code.Substring(0, 3); } }
}

Code的值总是4个字符长,但有时我只需要绑定(bind)3个字符。因此,Code3 属性。

下面是代码在我的自定义组合框中如何设置 ItemsSource:

private static void SetItemsSource(CustomComboBox combo)
{
if (string.IsNullOrEmpty(combo.Key1) || string.IsNullOrEmpty(combo.Key2))
{
combo.ItemsSource = null;
return;
}

List<DataDictionaryItem> list = GetDataDictionaryList(combo.Key1, combo.Key2);
combo.ItemsSource = list;
}

现在,我的问题是,当我将 XAML 中的 SelectedValuePath 更改为 Code3 时,它不起作用。我绑定(bind)到 SelectedValue 的内容仍然从 DataDictionaryItem 获取完整的 4 个字符的代码。我什至尝试在 SelectedValuePath 更改且没有骰子时重新运行 SetItemsSource。

任何人都可以看到我需要做什么来让我的自定义组合框唤醒并使用提供的 SelectedValuePath(如果它在 XAML 中被覆盖)吗?在我的 SelectedValue 绑定(bind)业务对象中调整属性 setter 中的值不是一个选项。

下面是 XAML 如何在表单中查找我的组合框:

<c:CustomComboBox Key1="0" Key2="8099" SelectedValuePath="Code3" SelectedValue="{Binding Thing}"/>

编辑:我只是窥探了我的代码,它说我的 SelectedValuePath 是 Code...它似乎从未设置为 Code3...Zuh?

最佳答案

好的,我明白了。

显然,在 WPF 控件的默认非静态构造函数中设置 DependencyProperty 的默认值是一个禁忌。所以,起初我试过这个:

static ValueCodeListComboBox()
{
SelectedValuePathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new PropertyMetadata("Code"));
DisplayMemberPathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new PropertyMetadata("Description"));
}

但这一直抛出一个错误说:

元数据覆盖和基础元数据必须是同一类型或派生类型。

最后发现这意味着我需要使用 FrameworkPropertyMetadata 而不是 PropertyMetadata:

static ValueCodeListComboBox()
{
SelectedValuePathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new FrameworkPropertyMetadata("Code"));
DisplayMemberPathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new FrameworkPropertyMetadata("Description"));
}

现在在 XAML 中更改 SelectedValuePath 效果很好。

关于WPF 派生 ComboBox SelectedValuePath 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405473/

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