プロパティ ItemsSource と SelectedValue がモデルにバインドされている ComboBox があります。モデルで選択したアイテムを別のアイテムに調整する必要がある場合がありますが、モデルでそれを行うと、SelectedValue が適切に設定されていても (snoop と SelectionChanged の両方でチェックされます)、モデルの値がビューに反映されません。イベント ハンドラー)。
問題を説明するために、単純な 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;
}
}
動作は次のようになると予想しました。
- 最初は2人選択
- 「1つ」を選択 -> コンボボックスに「1つ」が表示されます
- 「2」を選択 -> コンボボックスに「2」が表示されます
- "three" を選択 -> ComboBox に " one "が表示されます
- "four" を選択 -> ComboBox に "four" が表示されます
ただし、#4 では「3」が表示されます。なんで?モデルの値は 1 (「1」) に変更されましたが、ビューには引き続き 3 (「3」) が表示されます。
SelectionChanged イベント ハンドラーでバインディング ターゲットを明示的に更新することで回避策を見つけましたが、これは間違っているようです。これを達成する別の方法はありますか?