Объем вопроса расширен на 2010-03-25привязка данных к ObservableCollection в другом UserControl - как сохранить текущий выбор?
Я в конечном итоге выяснить мою проблему, но вот новая проблема, которая пришла в результате решения оригинального вопроса, потому что я хочу, чтобы иметь возможность наградить кого-то наградой !!!
После того, как я понял мою проблему, я вскоре обнаружил, что, когда обновления ObservableCollection, то есть ComboBox с привязкой к данным его содержание заселен, но наиболее из выборов были гасятся.
Предполагаю, что в этом случае MVVM будет затруднять запоминание последнего выбранного элемента. У меня есть идея, но это кажется немного неприятным. Я награду щедростью, кто придет с хорошим решением для этого!
Вопрос переписан на 2010-03-24
У меня есть два UserControls где один диалог, который имеет TabControl, а другой один, который появляется в упомянутом TabControl. Я просто позвоню им CandyDialog и CandyNameViewer для простоты. Существует также класс управления данными под названием Tracker, который управляет хранением информации, который для всех целей и задач просто предоставляет публичное свойство, которое является ObservableCollection.
отобразилась CandyNameViewer в CandyDialog через код позади, как это:
private void CandyDialog_Loaded(object sender, RoutedEventArgs e)
{
_candyviewer = new CandyViewer();
_candyviewer.DataContext = _tracker;
candy_tab.Content = _candyviewer;
}
XAML В CandyViewer выглядит следующим образом (отредактированный для kaxaml):
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<DataTemplate x:Key="CandyItemTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"></ColumnDefinition>
<ColumnDefinition Width="150"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Text="{Binding CandyName}" Margin="3"></TextBox>
<!-- just binding to DataContext ends up using InventoryItem as parent, so we need to get to the UserControl -->
<ComboBox Grid.Column="1" SelectedItem="{Binding SelectedCandy, Mode=TwoWay}" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.CandyNames}" Margin="3"></ComboBox>
</Grid>
</DataTemplate>
</Page.Resources>
<Grid>
<ListBox DockPanel.Dock="Top" ItemsSource="{Binding CandyBoxContents, Mode=TwoWay}" ItemTemplate="{StaticResource CandyItemTemplate}" />
</Grid>
</Page>
Теперь все работает отлично, когда управление загружены. Пока CandyNames заполняется сначала, а затем отображается пользовательский UserControl, все имена есть. Я, очевидно, не получаю никаких ошибок в окне вывода или что-то в этом роде.
Проблема у меня в том, что, когда ObservableCollection изменяется от модели, эти изменения не отражение в потребительском UserControl! Раньше у меня никогда не было этой проблемы; все мои предыдущие применения ObservableCollection обновлены отлично, хотя в тех случаях я не привязывался к сборкам. Хотя я в настоящее время только добавляю и удаляю имена конфет в/из ObservableCollection, позднее я, вероятно, также разрешу переименование с модели.
Есть ли что-то, что я сделал не так? Есть ли хороший способ отладить это? Reed Copsey indicates here, что возможна привязка данных между UserControl. К сожалению, мой любимый Bea Stollnitz article on WPF databinding debugging не предлагает ничего, что я мог бы использовать для этой конкретной проблемы.
Не могли бы вы описать изменения, которые производятся для наблюдаемой коллекции? Вы добавляете или удаляете строки или меняете значение существующих строк? Я подозреваю, что это может быть из-за того, что ваши строки не являются DependencyObjects или реализуют INotifyPropertyChanged – Daniel
Я добавляю/удаляю строки. – Dave