2009-02-16 14 views
5

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.Combobox no se vincula correctamente a SelectedItem

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 la primera reflexión que se llama es el captador para la recogida de 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 esté azul en la cara y el colocador de la propiedad SelectedSubscription no se cambie de nuevo. 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 el getter para la colección Subscriptions y finalmente el setter para SelectedSubscription se llama segunda vez y tiene un valor que coincide con el primer elemento en la colección Suscripciones.

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

Gracias

Respuesta

0

Disculpa por el retraso en la publicación de una respuesta. Hubo algún tipo de problema con la creación y el inicio de una Open ID.

Este es un problema bastante extraño.

La resolución de este problema no proviene 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> 

Se estaba siendo referenciado por dos bloques de texto en la misma ventana como 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.

1

cambian Posiblemente

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

a

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

Lo intenté pero no funciona. Una de las cosas que estaba tratando de señalar en la publicación original es que tengo otro proyecto con la misma vista y modelo de vista ... copia y línea pasada para la línea. El otro proyecto funciona bien. –

+0

En realidad, después de publicar que comencé a tener problemas vinculantes con un cuadro combinado de Silverlight, por lo que tal vez sea contagioso. – geofftnz

0

La forma correcta para depurar esto es tomar el proyecto de trabajo y de forma alterna (modificarlo para que coincida con el código roto/confirmación 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 punto posiblemente relacionado (en el que no está muy claro cuál es el problema en el proyecto roto es), es posible que tenga una mirada en this StackOverflow question ("Combobox controlando tabcontrol") que se relaciona con:

  • WPF,
  • ComboBoxes,
  • TabControls, y
  • unión entre ellos utilizando SelectedIndex.

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

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

Cuestiones relacionadas