1

オブジェクトのリストの ItemsSource を持つコンボボックスがあります。そのため、DisplayMemberPath はオブジェクトの特定のプロパティに設定されます。もちろん、これは正しい値が ComboBoxItem に表示されることを意味します。

私の問題は、XAML の DisplayMemberPath によって返される「値」を取得して、それを別のものにバインドできるようにしたいということです。つまり、ComboBoxItem に「DisplayText」プロパティを設定したいと考えています。

もちろん、私はこれを持っていないので、ContentHost を探して ComboBoxItem のテンプレートに移動せずにこの値を取得する方法を知っている人はいますか?

これの私の特定の使用法に興味がある場合は、ComboBox のスタイルでこれを実行しようとしています。

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

もちろんPath=Content、ItemsSource をプロパティにバインドするだけであれば問題なく動作しますが、それが DisplayMemberPath を持つオブジェクトの場合、Content はそのオブジェクトになります。

問題のヘルプまたは再構成に感謝します。

4

3 に答える 3

1

このような問題を処理する最も簡単な方法は、通常、添付プロパティと動作です。

DisplayMemberPathとという名前の 2 つの添付プロパティを作成して、親にDisplayTextバインドし、 に同じパスを持つ独自のバインディングを設定できます。その後、バインドできるプロパティがありますDisplayMemberPathComboBox DisplayMemberPathPropertyChangedCallbackDisplayText

<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);
    }
}
于 2011-08-18T23:03:30.577 に答える
0

SelectedItemViewModelの中間オブジェクトをComboboxのプロパティにバインドできます。次に、他の表示アイテムをその中間オブジェクトにバインドします。次にPropertyChanged、アイテムを選択してイベントが発生すると、イベントチェーンを介して表示も更新されます。

于 2011-08-18T19:42:06.647 に答える
0

SelectedValuePath を使用していますか? そうでない場合は、DisplayMemberPath と同じように設定でき、選択した値は SelectedValue として使用できます。

于 2011-08-18T19:52:42.197 に答える