У меня есть ComboBox, чьи свойства ItemsSource и SelectedValue привязаны к модели. Иногда модели нужно настроить выбранный элемент на другой, но когда я делаю это в модели, значение модели не отражается в представлении, даже если выбранное значение правильно установлено (отмечено как с помощью snoop, так и в SelectionChanged обработчик события).Почему WPF ComboBox не отражает правильное значение привязки?
Чтобы проиллюстрировать эту проблему, вот простой XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<ComboBox Height="25" Width="120" SelectedValue="{Binding SelectedValue}" SelectedValuePath="Key" ItemsSource="{Binding PossibleValues}" DisplayMemberPath="Value"/>
</Grid>
</Window>
А вот модель:
using System.Collections.Generic;
using System.Windows;
using System.ComponentModel;
namespace WpfApplication1
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
int m_selectedValue = 2;
Dictionary<int, string> m_possibleValues = new Dictionary<int, string>() { { 1, "one" }, { 2, "two" }, { 3, "three" }, {4,"four"} };
public int SelectedValue
{
get { return m_selectedValue; }
set
{
if (value == 3)
{
m_selectedValue = 1;
}
else
{
m_selectedValue = value;
}
PropertyChanged(this, new PropertyChangedEventArgs("SelectedValue"));
}
}
public Dictionary<int, string> PossibleValues
{
get { return m_possibleValues; }
set { m_possibleValues = value; }
}
public MainWindow()
{
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
I Ожидаемое поведение быть следующим:
- Первоначально выбрано два значения:
- Выберите «один» -> ComboBox movea YS "один"
- Выберите "два" -> ComboBox отображает "два"
- Выберите "три" -> ComboBox отображает "один"
- Выберите "четыре" -> ComboBox отображает "четыре"
Однако в №4 отображается «три». Зачем? Значение в модели было изменено на 1 («один»), но в представлении по-прежнему отображается 3 («три»).
Я нашел обходное решение, явно обновляя цель привязки в обработчике события SelectionChanged, но это кажется неправильным. Есть ли другой способ достичь этого?
Не должно ли ComboBox отображать текущее состояние модели? Это может быть неинтуитивно, но это правильная вещь для отображения. Это на самом деле упрощенный пример. Фактический пример использования немного сложнее, но он сводится к той же проблеме. – Rado
Вы пытались сделать SelectedValue явно двусторонним? {Binding Path = SelectedValue, Mode = TwoWay} –
@ Режим JacobProffitt по умолчанию имеет значение TwoWay, но я просто попытался установить его явно, и проблема не устранена. – Rado