wpf combobox selectedvalue

wpf - Combobox no se une correctamente a SelectedItem



selectedvalue (3)

Posiblemente cambie

SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}"

a

SelectedItem="{Binding Path=SelectedSubscription, Mode=TwoWay}"

Tengo dos proyectos. Uno está funcionando y el otro no es sin embargo las diferencias entre ellos no es nada que yo piense que "debería" ser de ninguna importancia. El primer proyecto es el que está roto y es el que estoy tratando de arreglar. El segundo proyecto es un pequeño proyecto de muestra que creé cuando el primer proyecto simplemente no funciona en absoluto. Por supuesto, la muestra funciona a la perfección.

Aquí está la vista para el primer proyecto. He eliminado un montón del "MainWindowTabControlStyle" porque es solo el cuadro combinado que está roto. Estoy razonablemente seguro de que el problema no está en el estilo porque es una copia y pega del proyecto que está funcionando.

<Grid> <TabControl Style="{DynamicResource MainWindowTabControlStyle}"> <TabItem Header="Tab 1"/> <TabItem Header="Tab 2"/> </TabControl> </Grid> <Style x:Key="MainWindowTabControlStyle" TargetType="{x:Type TabControl}"> ... <ComboBox HorizontalAlignment="Right" VerticalAlignment="Top" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Path=Subscriptions, Mode=Default}" SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}" ItemTemplate="{DynamicResource SubscriptionsItemTemplate}"/> ... </Style> <DataTemplate x:Key="SubscriptionsItemTemplate"> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Path=DisplayName, Mode=Default}"/> </StackPanel> </DataTemplate>

Aquí está el modelo de vista que se establece en el DataContext de MainWindow. La clase ViewModelBase es exactamente el mismo código que Josh Smith escribió en este artículo de MSDN de meses.

public sealed class MainWindowViewModel : ViewModelBase { public MainWindowViewModel() { } private ObservableCollection<Subscription> subscriptions; public ObservableCollection<Subscription> Subscriptions { get { if (subscriptions == null) { subscriptions = new ObservableCollection<Subscription>(); subscriptions.Add(new Subscription() { DisplayName = "ABC" }); subscriptions.Add(new Subscription() { DisplayName = "XYZ" }); subscriptions.Add(new Subscription() { DisplayName = "PDQ" }); } return subscriptions; } set { subscriptions = value; } } private Subscription selectedSubscription; public Subscription SelectedSubscription { get { return selectedSubscription; } set { selectedSubscription = value; } } }

Cuando ejecuto el proyecto desde el depurador, lo primero que se llama es el captador para la colección Suscripciones. Luego se invoca al colocador en SelectedSubscription (es nulo). Después de eso, puedo cambiar el elemento seleccionado en el cuadro combinado hasta que me quede azul en la cara y el colocador de la propiedad SelectedSubscription no se vuelva a cambiar. Es importante tener en cuenta que el cuadro combinado contiene los valores correctos.

En el segundo proyecto, el código es idéntico, pero lo primero que se llama es el setter para la propiedad SelectedSubscription (es nulo), luego se llama al getter para la colección Subscriptions y finalmente se llama al setter para SelectedSubscription por segunda vez. tiene un valor que coincide con el primer elemento de la colección Suscripciones.

Esta pequeña joya me ha costado unas 5 horas, si tienes alguna idea, estoy dispuesto a probarla.

Gracias


Perdón por la demora en publicar una respuesta. Hubo algún tipo de problema con la creación y el inicio de una Open ID.

Este es un problema muy extraño.

La resolución de este problema no vino de la ventana en absoluto. Antes de llamar al método de mostrar de la ventana había otra ventana que se abrió como un diálogo. En este diálogo había el siguiente recurso

<Window.Resources> <DropShadowBitmapEffect x:Key="DropShadowEffect" Noise="0" Opacity="0.45" ShadowDepth="5" Softness="0.25"/> </Window.Resources>

Estaba siendo referenciado por dos bloques de texto en la misma ventana que un "DynamicResource". Después de desactivar el diálogo y hacer que la aplicación comience con las ventanas que tenían el problema, se descubrió que el problema estaba causado por la ventana de diálogo. Mientras investigaba el problema, un compañero de trabajo me sugirió convertir DynamicResource en StaticResource porque no había ninguna razón para que fuera dinámico.

Este cambio en una ventana de diálogo utilizando un recurso que solo estaba disponible dentro del alcance de la ventana de diálogo solucionó el problema de enlace descrito anteriormente en la "Ventana principal". Supongo que cosas más extrañas pueden suceder.


La manera correcta de depurar esto es tomar el proyecto en funcionamiento y alternativamente (modificarlo para que coincida con el código roto / confirmar que funciona) hasta que sea idéntico al proyecto roto o se rompa. El punto en el que se rompe te dice dónde está el problema. La modificación del proyecto roto suele ser una causa perdida.

Como punto secundario, recomendaría agregar el espacio de nombres System.Diagnostics a su XAML. Aparecerá un error en la ventana Visual Studio Output.

xmlns:debug="clr-namespace:System.Diagnostics;assembly=WindowsBase"

Como un punto posiblemente relacionado (en el sentido de que no está claro cuál es el problema en el proyecto roto), puede echar un vistazo a esta pregunta de ("Combobox que controla Tabcontrol") que se relaciona con:

  • WPF,
  • ComboBoxes,
  • TabControles, y
  • vinculante entre ellos utilizando SelectedIndex.

Todavía no hay una solución a esta pregunta, pero es un problema más simple.

Por último, el código MSDN de Josh Smith es bastante grande. Es difícil descubrir qué ha cambiado para agregar su ComboBox sin ver todo el código.