我有一个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的对象时,内容将是该对象。
感谢您提供帮助或重新解决问题。
答案 0 :(得分:1)
处理此类问题的最简单方法通常是附加属性和行为。
您可以创建两个名为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);
}
}
答案 1 :(得分:0)
您可以将ViewModel中的中间对象绑定到Combobox上的SelectedItem
属性。然后还将您的其他显示项绑定到该中间对象。然后,当通过选择项目触发PropertyChanged
事件时,显示也将通过事件链进行更新。
答案 2 :(得分:0)
您使用的是SelectedValuePath吗?如果没有,你可以设置它与DisplayMemberPath相同,然后选择的值可用作SelectedValue。