В верхней части моей головы (я могу ошибаться), заставьте окно реализовать INotifyPropertyChanged и добавьте событие:
namespace Wpf.ComboBoxDemo
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public MainWindow()
{
Затем добавьте свойство для выбранного в данный момент элементакоторый уведомляет об изменениях:
private Person _selected;
public Person MySelected
{
get { return _selected; }
set
{
if (value != _selected)
{
_selected = value;
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs("MySelected"));
}
}
}
}
Теперь свяжите комбинированный список (привязка может быть более продвинутой, используя FindAncestor , но иногда, чтобы упростить задачу, я помещаю текстовый код данных в код позади):
XAML :
<ComboBox
Name="MyComboBox"
DisplayMemberPath="LastName"
SelectedItem="{Binding MySelected}" />
Код позади :
public MainWindow()
{
InitializeComponent();
// ...
// this will cause the "MySelected" binding to target the correct property on this object
MyComboBox.DataContext = this;
}
Я думаю, что-то вроде этого.Я не могу проверить это прямо сейчас, но, надеюсь, это подтолкнет вас в правильном направлении.
Редактировать: Если вы хотите попробовать «другой способ» привязки, вот как.Разверните привязку SelectedItem
, чтобы она выглядела следующим образом:
<ComboBox
Name="MyComboBox"
DisplayMemberPath="LastName"
SelectedItem="{Binding MySelected,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Window}}}" />
Теперь вы можете пропустить установку DataContext
в коде:
public MainWindow()
{
InitializeComponent();
// ...
// this will cause the "MySelected" binding to target the correct property on this object
//MyComboBox.DataContext = this;
}
Это потому, что режим FindAncestor
заставляет ComboBox
сам находить объект, к которому оно должно привязать свойство, а не вы это специально указываете.
Актуальная горячая тема здесь, в офисе, - какой из этих двух способов лучший.Для меня это просто больше XAML и меньше кода позади (или наоборот), просто используйте метод, который размещает код там, где вам удобно работать.Я думаю, что есть некоторые сценарии, в которых последний предпочтительнее (например, когда вы включаете элементы управления связыванием данных в другие элементы управления), но я просто балуюсь, так что я еще не разобрался с этими частями.