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
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. –
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