访问ComboBoxItem DisplayValue

时间:2011-08-18 19:10:39

标签: wpf binding combobox element-binding

我有一个comboBox,它有一个对象列表的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的对象时,内容将是该对象。

感谢您提供帮助或重新解决问题。

3 个答案:

答案 0 :(得分:1)

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

您可以创建两个名为DisplayMemberPathDisplayText的附加属性,然后将DisplayMemberPath绑定到父ComboBox DisplayMemberPathPropertyChangedCallback你设置了自己的绑定与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>

<强> DisplayTextBehavior

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);
    }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您使用的是SelectedValuePath吗?如果没有,你可以设置它与DisplayMemberPath相同,然后选择的值可用作SelectedValue。