Доступ к ComboBoxItem DisplayValue - PullRequest
       20

Доступ к ComboBoxItem DisplayValue

1 голос
/ 18 августа 2011

У меня есть comboBox, у которого есть ItemsSource из списка объектов. Таким образом, DisplayMemberPath устанавливается для определенного свойства объекта. Конечно, это означает, что в ComboBoxItem отображается правильное значение.

Моя проблема в том, что я хотел бы иметь возможность получить это «Значение», которое возвращается DisplayMemberPath в XAML, чтобы я мог связать его с чем-то другим. я хотел бы иметь свойство "DisplayText" для ComboBoxItem.

Конечно, у меня этого нет, поэтому кто-нибудь знает, как получить это значение, не обращаясь к шаблону ComboBoxItem в поисках ContentHost?

Если вы заинтересованы в моем конкретном использовании этого, я пытаюсь сделать это в стиле ComboBox:

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

Конечно, Path=Content прекрасно работает, если вы просто привязываете свой ItemsSource к свойствам, но когда это объект с DisplayMemberPath, Content будет этим объектом.

Спасибо за любую помощь или переосмысление проблемы.

Ответы [ 3 ]

1 голос
/ 19 августа 2011

Самый простой способ справиться с подобными проблемами - это обычно Attached Properties и Behaviors.

Вы можете создать два вложенных свойства с именами DisplayMemberPath и 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>

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);
    }
}
0 голосов
/ 18 августа 2011

Вы используете SelectedValuePath?Если нет, вы можете установить его так же, как DisplayMemberPath, и тогда выбранное значение будет доступно как SelectedValue.

0 голосов
/ 18 августа 2011

Вы можете привязать промежуточный Объект в ViewModel к свойству SelectedItem в Combobox. Затем также привяжите другой элемент отображения к этому промежуточному объекту. Затем, когда событие PropertyChanged запускается при выборе элемента, отображение также обновляется через цепочку событий.

...