objects wpf data-binding binding combobox

wpf - objects - ComboBox.SelectedValue no se actualiza desde el origen de enlace



wpf combobox datacontext (11)

Aquí está mi objeto fuente vinculante:

Public Class MyListObject Private _mylist As New ObservableCollection(Of String) Private _selectedName As String Public Sub New(ByVal nameList As List(Of String), ByVal defaultName As String) For Each name In nameList _mylist.Add(name) Next _selectedName = defaultName End Sub Public ReadOnly Property MyList() As ObservableCollection(Of String) Get Return _mylist End Get End Property Public ReadOnly Property SelectedName() As String Get Return _selectedName End Get End Property End Class

Aquí está mi XAML:

<Window x:Class="Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" xmlns:local="clr-namespace:WpfApplication1" > <Window.Resources> <ObjectDataProvider x:Key="MyListObject" ObjectInstance="" /> </Window.Resources> <Grid> <ComboBox Height="23" Margin="24,91,53,0" Name="ComboBox1" VerticalAlignment="Top" SelectedValue="{Binding Path=SelectedName, Source={StaticResource MyListObject}, Mode=OneWay}" ItemsSource="{Binding Path=MyList, Source={StaticResource MyListObject}, Mode=OneWay}" /> <Button Height="23" HorizontalAlignment="Left" Margin="47,0,0,87" Name="btn_List1" VerticalAlignment="Bottom" Width="75">List 1</Button> <Button Height="23" Margin="0,0,75,87" Name="btn_List2" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75">List 2</Button> </Grid> </Window>

Aquí está el código detrás:

Class Window1 Private obj1 As MyListObject Private obj2 As MyListObject Private odp As ObjectDataProvider Public Sub New() InitializeComponent() Dim namelist1 As New List(Of String) namelist1.Add("Joe") namelist1.Add("Steve") obj1 = New MyListObject(namelist1, "Steve") . Dim namelist2 As New List(Of String) namelist2.Add("Bob") namelist2.Add("Tim") obj2 = New MyListObject(namelist2, "Tim") odp = DirectCast(Me.FindResource("MyListObject"), ObjectDataProvider) odp.ObjectInstance = obj1 End Sub Private Sub btn_List1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_List1.Click odp.ObjectInstance = obj1 End Sub Private Sub btn_List2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_List2.Click odp.ObjectInstance = obj2 End Sub End Class

Cuando la ventana se carga por primera vez, los enlaces se conectan bien. El ComboBox contiene los nombres "Joe" y "Steve" y "Steve" está seleccionado por defecto. Sin embargo, cuando hago clic en un botón para cambiar ObjectInstance a obj2, ComboBox ItemsSource se llena correctamente en el menú desplegable, pero SelectedValue se establece en Nothing en lugar de ser igual a obj2.SelectedName.


¿Es razonable establecer SelectedValuePath = "Content" en el xaml del combobox, y luego usar SelectedValue como el enlace?

Parece que tiene una lista de cadenas y desea que el enlace solo haga coincidir cadenas con el contenido real del elemento en el cuadro combinado, de modo que si le dice qué propiedad usar para SelectedValue debería funcionar; al menos, eso funcionó para mí cuando me encontré con este problema.

Parece que el contenido sería un valor razonable para SelectedValue, pero quizás no lo sea.


¿Has intentado crear un evento que indique que se ha actualizado SelectName, por ejemplo, OnPropertyChanged ("SelectedName")? Eso funcionó para mí.


El modo de enlace debe ser OneWayToSource o TwoWay ya que la fuente es la que desea actualizar. El modo OneWay es de origen a destino y, por lo tanto, hace que el origen sea solo de lectura, lo que da como resultado que nunca se actualice el origen.


El tipo de SelectedValuePath y SelectedValue debe ser EXACTAMENTE el mismo.

Si, por ejemplo, el tipo de SelectedValuePath es Int16 y el tipo de propiedad que se une a SelectedValue es int , no funcionará.

Paso horas para encontrar eso, y es por eso que estoy respondiendo aquí después de tanto tiempo la pregunta fue hecha. Tal vez otro pobre tipo como yo con el mismo problema pueda verlo.


Encontré algo similar, finalmente me suscribí al evento SelectionChanged para el menú desplegable y establecí mi propiedad de datos con él. Tonto y desearía que no fuera necesario, pero funcionó.


Para despertar una conversación de 2 años:

Otra posibilidad, si quiere usar cadenas, es vincularla a la propiedad Text del cuadro combinado.

<ComboBox Text="{Binding Test}"> <ComboBoxItem Content="A" /> <ComboBoxItem Content="B" /> <ComboBoxItem Content="C" /> </ComboBox>

Eso se debe a algo así como:

public class TestCode { private string _test; public string Test { get { return _test; } set { _test = value; NotifyPropertyChanged(() => Test); // NotifyPropertyChanged("Test"); if not using Caliburn } } }

El código anterior es bidireccional, por lo que si configura Test = "B"; en el código, el cuadro combinado mostrará ''B'', y luego, si selecciona ''A'' en el menú desplegable, la propiedad enlazada reflejará el cambio.


Problema:

La clase ComboBox busca el objeto especificado utilizando el método IndexOf. Este método usa el método Equals para determinar la igualdad.

Solución:

Por lo tanto, intente establecer SelectedIndex utilizando SelectedValue a través de Converter como este:

C # code

//Converter public class SelectedToIndexConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value != null && value is YourType) { YourType YourSelectedValue = (YourType) value; YourSelectedValue = (YourType) cmbDowntimeDictionary.Tag; YourType a = (from dd in Helper.YourType where dd.YourTypePrimaryKey == YourSelectedValue.YourTypePrimaryKey select dd).First(); int index = YourTypeCollection.IndexOf(a); //YourTypeCollection - Same as ItemsSource of ComboBox } return null; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { if (value!=null && value is int) { return YourTypeCollection[(int) value]; } return null; } }

Xaml

<ComboBox ItemsSource="{Binding Source={StaticResource YourDataProvider}}" SelectedIndex="{Binding Path=YourValue, Mode=TwoWay, Converter={StaticResource SelectedToIndexConverter}, UpdateSourceTrigger=PropertyChanged}"/>

¡Buena suerte! :)


Solo resolvió esto. Huh! O usa [uno de ...] .SelectedValue | .SelectedItem | .SelectedText Sugerencia: el valor seleccionado se prefiere para ComboStyle.DropDownList, mientras que .SelectedText es para ComboStyle.DropDown.

-Esto debería solucionar tu problema. Me tomó más de una semana resolver este pequeño fyn. ¡ja!


Tuvimos un problema similar la semana pasada. Tiene que ver con cómo SelectedValue actualiza sus aspectos internos. Lo que encontramos fue que si configuraba SelectedValue no vería el cambio, sino que debería establecer SelectedItem que actualizaría correctamente todo. Mi conclusión es que SelectedValue está diseñado para operaciones de obtención y no se establece . Pero esto puede ser un error en la versión actual de 3.5sp1 .net


Utilizar

UpdateSourceTrigger=PropertyChanged

en el enlace


Ya sabes ... He estado luchando con este problema durante horas hoy, ¿y sabes lo que descubrí? ¡Era un problema de DataType! La lista que estaba llenando el ComboBox era Int64, y yo estaba tratando de almacenar el valor en un campo Int32. No se lanzaron errores, ¡simplemente no estaba almacenando los valores!