WPF CheckBox IsChecked не может быть сброшен при обновлении страницы (источника данных) - PullRequest
0 голосов
/ 26 февраля 2010

У меня есть вопрос на флажок. Прежде всего, У меня есть usercontrol, который имеет поле со списком, подобное этому, и этот пользовательский элемент управления будет переключаться с помощью кнопки 2, а затем источник данных будет изменен, а затем отобразится отображаемый статус сотрудника:

Когда я отмечаю этот флажок, значение «офицеры [0] .IsOnDuty» будет изменено на «истина». Проблема в: Когда я нажимаю другую кнопку и переключаюсь на другой источник данных, этот установленный флажок все еще установлен, но для офицеров [0] .IsOnDuty для этого источника данных установлено значение false.

Как это решить?

Ответы [ 3 ]

1 голос
/ 26 февраля 2010

Контекст данных элемента списка - это элемент вашей коллекции офицеров, а не сама коллекция. И использование односторонней привязки некорректно, поскольку источник данных (сотрудник) не будет обновляться. Поэтому измените DataTemplate на:

<CheckBox IsChecked="{Binding Path=IsOnDuty, Mode=TwoWay}" />
0 голосов
/ 26 февраля 2010

Проблема с вашим подходом состоит в том, что после того, как вы измените ItemSource (переключившись на следующую страницу), ваш chekcbox все еще будет привязан к элементу первой коллекции. Я думаю, что это происходит потому, что вы явно используете индексатор для привязки Path=Officers[0].IsOnDuty

Ваш список сэмплов xaml не имеет смысла. ItemsSoruce - это OfficerCollection, и ваш ItemTemplate также привязывается к коллекции офицеров. В зависимости от того, что вы пытаетесь выполнить, вы должны выполнить одно из следующих действий:

Если вас просто интересует первый офицер (как показывает ваш пример), добавьте свойство DependencyProperty FirstOfficer (или INotifyPropertyChanged) в свою коллекцию и привяжите к нему: IsChecked="{Binding Path=Officers.FirstOfficer, Mode=OneWay}"

Если вас, однако, интересуют все сотрудники и вы хотите установить флажки для всех них, вы должны создать DataTemplate для типа Officer и использовать его в качестве ItemTemplate.

Как правило, вы можете избежать больших проблем, если будете придерживаться MVVM и действительно адаптировать свои объекты ViewModel очень близко к тому, что нужно View, чтобы вы могли связать View с ViewModel самым простым способом. Представьте, что ViewModel - это представление, которое вы хотите построить, но без визуального представления.

0 голосов
/ 26 февраля 2010

* Вот список xaml:

<ListBox ItemsSource="{Binding OfficersCollection}">
<ListBox.ItemTemplate>             
<DataTemplate>                                           
<CheckBox IsChecked="{Binding Path=Officers[0].IsOnDuty, Mode=OneWay}" />

*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...