Tengo un ComboBox cuyas propiedades ItemsSource y SelectedValue están asociadas a un modelo. Algunas veces, el modelo necesita ajustar el elemento seleccionado a uno diferente, pero cuando lo hago en el modelo, el valor del modelo no se refleja en la Vista, aunque SelectedValue esté configurado correctamente (marcado tanto con snoop como en SelectionChanged controlador de eventos).¿Por qué WPF ComboBox no refleja correctamente el valor encuadernado?
Para ilustrar el problema, aquí es una xaml simple:
<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>
Y aquí es el modelo:
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;
}
}
que esperaba que la conducta es la siguiente:
- Inicialmente, se selecciona dos
- Seleccione "uno" -> ComboBox displa ys "uno"
- Seleccione "dos" -> pantallas ComboBox "dos"
- Seleccione "tres" -> ComboBox muestra "uno"
- Seleccione "cuatro" -> muestra ComboBox "cuatro"
Sin embargo, en el n. ° 4, se muestra "tres". ¿Por qué? El valor en el modelo se cambió a 1 ("uno"), pero la vista todavía muestra 3 ("tres").
He encontrado una solución al actualizar explícitamente el destino de enlace en un controlador de evento SelectionChanged, pero esto parece incorrecto. ¿Hay alguna otra manera de lograr esto?
¿No debería el ComboBox mostrar el estado actual del modelo? Puede que no sea intuitivo, pero es lo correcto para mostrar. Este es en realidad un ejemplo simplificado. El caso de uso real es un poco más complicado, pero se reduce al mismo problema – Rado
¿Ha intentado hacer el SelectedValue explícitamente bidireccional? {Binding Path = SelectedValue, Mode = TwoWay} –
@JacobProffitt El modo es TwoWay por defecto, pero intenté configurarlo explícitamente y el problema persiste. – Rado