Я привязал текст текстового поля и выбранный элемент поля со списком к моей модели представления. Элементы в поле со списком привязаны к статическому свойству.
<TextBox x:Name="Texty"
Text="{Binding CurrentThing.Texty}" ... />
<ComboBox x:Name="Picky"
ItemsSource="{x:Static local:MainWindow.AllPickables}"
SelectedItem="{Binding CurrentThing.Picked}" ... />
Кажется, что привязка действует, потому что текстовое поле получает правильное содержимое. Поле со списком также правильно отображает значения в списке. Однако проблема в том, что выбор не производится.
Сначала я подумал, что это связано с тем, что некоторые контроллеры имеют другое значение по умолчанию для Mode, поэтому я попытался явно установить его как двусторонний для поля со списком. Насколько я мог видеть, никакой разницы в поведении.
Что я делаю не так. Как ее решить (или хотя бы устранить неисправность)?
Я следил за всеми подсказками из всего, что мог найти, поскольку подсказки больше или менее одинаковые везде. Ничего не сработало, примите подход установки выбранного индекса вместо выбранного элемента. К сожалению, я не понимаю, как мне этого добиться.
Я пробовал добавить DisplayMemberPath, как было предложено. Это не сработало и элементы поля со списком больше не присутствуют. Я предполагаю, что DisplayMemberPath относится к тому, где взять материал для разбивки на элементы из всего, что упоминается в ItemSource (и там нет Picked) .
<ComboBox x:Name="Picky"
ItemsSource="{x:Static local:MainWindow.AllPickables}"
SelectedItem="{Binding CurrentOrder}"
DisplayMemberPath="Picked" ... />
Полный (почти) исходный код для сенарио
Просмотр назначения модели в главном окне.
<Window.DataContext>
<local:Presenter/>
</Window.DataContext>
Используемая модель представления (уменьшенная версия относительно рассматриваемых компонентов, чтобы быть минимальным примером).
public class Presenter : INotifyPropertyChanged
{
private ObservableCollection<Thing> _allThings;
private Thing _currentThing;
public Thing CurrentThing
{
get { return _currentThing; }
set { _currentThing = value; OnPropertyChanged(); }
}
public ListCollectionView AllThingsView { get; set; }
private IEnumerable<PickType> _allPickables;
public IEnumerable<PickType> AllPickables
{
get { return _allPickables; }
set { _allPickables = value; OnPropertyChanged(); }
}
public Presenter()
{
_allThings = new ObservableCollection<Thing>(DataAccessor.GetThings());
AllThingsView = new ListCollectionView(_allThings);
_allPickables = DataAccessor.GetPickables();
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] String name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
Код главного окна позади (части, которые относятся к используемым элементам управления и событиям). У меня также есть представление сетки под названием ThingListing в моей разметке, которое привязано к AllThingsView в моей модели представления. Когда я нажимаю на запись в ней, запускаемое событие должно обновить значение CurrentThing и изменить вкладку на ту, где размещены связанные элементы управления. Кажется, что все попадает в нужные места, принимает выбранные элементы для полей со списком. У меня также есть удобный метод расширения Get. Он делает то, что вы интуитивно думаете (проверено с течением времени).
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new Presenter();
}
private void ThingListing_OnMouseDoubleClick(Object sender, MouseButtonEventArgs eventArgs)
{
DataContext.Get<Presenter>().CurrentThing
= sender.Get<DataGrid>().CurrentItem.Get<Thing>();
Dispatcher.BeginInvoke((Action)(() => tabControl.SelectedIndex = 1));
}
}
class Thing
- person DrKoch   schedule 26.01.2015