Мне кажется, я знаю, что вы пытаетесь сделать. Вот возможное решение.
Для использования свойства SelectedItem следует использовать ListBox (или все, что происходит от элемента управления Selector).
<UserControl>
<Grid>
<StackPanel Grid.Column="0">
<ListBox x:Name="SettingListBox" Template="{StaticResource myDataTemplate}">
<Item>
<Setting Title="Foo" Description="Bar">
<Option>Yes</Option><Option>No</Option>
</Setting>
</Item>
</ListBox >
</StackPanel>
<StackPanel Grid.Column="1">
<TextBlock x:Name="Description"
Text="{Binding SelectedItem.Description, ElementName=SettingListBox}"/>
</StackPanel>
</Grid>
</UserControl>
Чтобы решить проблему, когда ваш ListBox не фокусируется на элементе при открытии раскрывающегося меню ComboBox, у меня есть прикрепленное свойство, которое исправит это для вас.
public class ListBoxHelper
{
#region Dependency Property
public static bool GetCanFocusParent(DependencyObject obj)
{
return (bool)obj.GetValue(CanFocusParentProperty);
}
public static void SetCanFocusParent(DependencyObject obj, bool value)
{
obj.SetValue(CanFocusParentProperty, value);
}
// Using a DependencyProperty as the backing store for CanFocusParent. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CanFocusParentProperty =
DependencyProperty.RegisterAttached("CanFocusParent", typeof(bool), typeof(ListBoxHelper), new UIPropertyMetadata(false, OnCanFocusParentChanged));
#endregion
private static void OnCanFocusParentChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
var element = obj as UIElement;
if(element == null) return;
if((bool)args.NewValue)
element.PreviewMouseDown += FocusOnParent;
else
element.PreviewMouseDown -= FocusOnParent;
}
private static void FocusOnParent(object sender, RoutedEventArgs e)
{
var listBoxItem = VisualUpwardSearch<ListBoxItem>(sender as DependencyObject) as ListBoxItem;
if (listBoxItem != null) listBoxItem.IsSelected = true;
}
public static DependencyObject VisualUpwardSearch<T>(DependencyObject source)
{
while (source != null && source.GetType() != typeof(T))
source = VisualTreeHelper.GetParent(source);
return source;
}
}
Этот маленький класс помогает вашему элементу управления сосредоточиться на выбранном элементе ListBox, когда вы активируете элемент управления внутри него (т. Е. Ваш ComboBox). Работает при щелчке мышью внутри элемента ListBox.
Теперь все, что вам нужно сделать, это прикрепить его к вашему ComboBox следующим образом:
<DataTemplate x:Key="myDataTemplate">
<ComboBox
TitleText="{Binding Title}"
DescriptionText="{Binding DescriptionText}"
CotrolHelper:ListBoxHelper.CanFocusParent="true"/>
</DataTemplate>
Где ControlHelper:
xmlns:ControlHelper="clr-namespace:WhereYouPutYour.ListBoxHelperClass"
И, наконец, чтобы отключить (но я рекомендую установить авто) полосу прокрутки, вы можете использовать вложенное свойство ScrollViewer в своем ListBox, например:
<ListBox
x:Name="SettingListBox"
Template="{StaticResource myDataTemplate}"
ScrollViewer.VerticalScrollBarVisibility="Disabled" >
<Item>
<Setting Title="Foo" Description="Bar">
<Option>Yes</Option><Option>No</Option>
</Setting>
</Item>
</ListBox >