1

我有一个包含对象列表的 ItemsSource 的组合框。因此 DisplayMemberPath 设置为对象的特定属性。当然这意味着正确的值显示在 ComboBoxItem 中。

我的问题是我希望能够获得由 XAML 中的 DisplayMemberPath 返回的“值”,以便我可以将其绑定到其他东西。即我想在 ComboBoxItem 上有一个“DisplayText”属性。

当然我没有这个,所以,有没有人知道一种方法来获取这个值,而无需遍历 ComboBoxItem 的模板来寻找 ContentHost?

如果您对我对此的具体使用感兴趣,我正在尝试对 ComboBox 的样式进行此操作:

....
<Setter Property="ItemContainerStyle">
   <Setter.Value>
      <Style>
        <Setter 
             Property="AutomationProperties.AutomationId" 
             Value="{Binding RelativeSource={RelativeSource Self}, Path=MagicPathForDisplayedText}"/>
....

Path=Content如果您只是将 ItemsSource 绑定到属性,当然可以正常工作,但是当它是具有 DisplayMemberPath 的对象时,内容将是该对象。

感谢您提供任何帮助或重新构建问题。

4

3 回答 3

1

处理此类问题的最简单方法通常是附加属性和行为。

DisplayMemberPath您可以创建两个名为and的附加属性DisplayText,然后绑定DisplayMemberPath到父级ComboBox DisplayMemberPath并在其中PropertyChangedCallback设置您自己的绑定,并使用相同的路径为DisplayText. 之后,您有一个可以绑定到的属性

<Style x:Key="ComboBoxStyle" TargetType="ComboBox">
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="ComboBoxItem">
                <Setter Property="behaviors:DisplayTextBehavior.DisplayMemberPath"
                        Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ComboBox}},
                                        Path=DisplayMemberPath}"/>
                <Setter Property="AutomationProperties.AutomationId"
                        Value="{Binding RelativeSource={RelativeSource Self},
                                        Path=(behaviors:DisplayTextBehavior.DisplayText)}"/>
            </Style>
        </Setter.Value>                    
    </Setter>
</Style>

显示文本行为

public class DisplayTextBehavior
{
    public static DependencyProperty DisplayMemberPathProperty =
        DependencyProperty.RegisterAttached("DisplayMemberPath",
                                            typeof(string),
                                            typeof(DisplayTextBehavior),
                                            new FrameworkPropertyMetadata("", DisplayMemberPathChanged));
    public static string GetDisplayMemberPath(DependencyObject obj)
    {
        return (string)obj.GetValue(DisplayMemberPathProperty);
    }
    public static void SetDisplayMemberPath(DependencyObject obj, string value)
    {
        obj.SetValue(DisplayMemberPathProperty, value);
    }

    private static void DisplayMemberPathChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        ComboBoxItem comboBoxItem = sender as ComboBoxItem;
        string displayMemberPath = GetDisplayMemberPath(comboBoxItem);
        comboBoxItem.SetBinding(DisplayTextProperty, new Binding(displayMemberPath));
    }

    public static DependencyProperty DisplayTextProperty =
        DependencyProperty.RegisterAttached("DisplayText",
                                            typeof(string),
                                            typeof(DisplayTextBehavior),
                                            new FrameworkPropertyMetadata(""));
    public static string GetDisplayText(DependencyObject obj)
    {
        return (string)obj.GetValue(DisplayTextProperty);
    }
    public static void SetDisplayText(DependencyObject obj, string value)
    {
        obj.SetValue(DisplayTextProperty, value);
    }
}
于 2011-08-18T23:03:30.577 回答
0

您可以将 ViewModel 中的中间对象绑定到SelectedItemCombobox 上的属性。然后还将您的其他显示项目绑定到该中间对象。然后当PropertyChanged通过选择一个项目触发事件时,显示也将通过事件链更新。

于 2011-08-18T19:42:06.647 回答
0

你在使用 SelectedValuePath 吗?如果不是,您可以将其设置为与 DisplayMemberPath 相同,然后所选值可用作 SelectedValue。

于 2011-08-18T19:52:42.197 回答