为何实现IReference<hstring>的自定义类作为ComboBox项时显示空白?
问题原因与解决方案
- 你自定义的
ListItem类没有完整实现IReference<hstring>继承链要求的所有接口:IReference<T>派生自IPropertyValue接口,除了你已经实现的Value()方法外,必须实现Type()方法返回对应的数据类型枚举值,否则XAML渲染器无法识别该装箱值的类型,无法读取显示内容。 - ComboBox默认的项文本渲染逻辑还会尝试调用对象的
IStringable::ToString()方法获取显示文本,你没有实现该接口也会导致渲染时拿不到可显示的字符串。
修复方案1:补全接口实现(模拟box_value行为)
补全IPropertyValue和IStringable接口的必要实现即可正常工作:
struct ListItem : implements<ListItem, IReference<hstring>, IStringable> { ListItem(hstring display, uint32_t extra) : m_Display(std::move(display)), m_Extra(extra) {} // IReference<hstring> 要求实现的方法 hstring Value() const { return m_Display; } // IPropertyValue 要求实现的方法 winrt::Windows::Foundation::PropertyType Type() const noexcept { return winrt::Windows::Foundation::PropertyType::String; } // 兼容默认渲染逻辑的IStringable实现 hstring ToString() const { return m_Display; } // 对外暴露额外自定义数据 uint32_t Extra() const noexcept { return m_Extra; } private: hstring m_Display; uint32_t m_Extra; };
修复方案2:更合理的自定义项实现(推荐)
不需要强行模拟装箱值的行为,直接定义普通数据类,搭配ComboBox的显示配置即可,逻辑更清晰也更易维护:
// 自定义普通数据类 struct ListItem : winrt::implements<ListItem> { ListItem(hstring display, uint32_t extra) : m_Display(std::move(display)), m_Extra(extra) {} // 显示用属性 hstring Display() const noexcept { return m_Display; } // 额外自定义数据 uint32_t Extra() const noexcept { return m_Extra; } private: hstring m_Display; uint32_t m_Extra; };
给ComboBox添加一行显示配置即可正常渲染:yourComboBox.DisplayMemberPath(L"Display");
内容的提问来源于stack exchange,提问作者yushang
相关产品推荐
相关产品推荐

