2009-02-06 5 views
3

J'ai un ListBox sur un formulaire lié à un ObservableCollection d'un type personnalisé. Dans chaque article, il y a un ComboBox lié à un type d'énumération. Lorsque la fenêtre se charge, tous les ComboBox sont définis par défaut sur une certaine valeur. Quand je change le SelectedItem pour un (de l'UI, pas du code), tous les autres ComboBox changent pour le même SelectedItem.Tous les ComboBox dans un ListBox changent lorsque l'un d'eux est modifié

Je ne suis pas sûr de ce que j'ai fait de mal, voici mon XAML actuel qui gère cela.

<Window.Resources> 
    <ObjectDataProvider x:Key="SyncOperationValues" 
         MethodName="GetNames" 
         ObjectType="{x:Type sys:Enum}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="local:SyncOperationEnum" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
... 
    <DataTemplate x:Key="SyncListTemplate"> 
     <Grid Grid.Column="1" Grid.RowSpan="2" Margin="0,0,20,0" x:Name="olDetails" 
      DataContext="{Binding Path=OlContact}"> 
      <Grid.RowDefinitions> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
      <RowDefinition /> 
      </Grid.RowDefinitions> 
... 
      <ComboBox x:Name="SyncOp" 
       Width="120" Height="19" 
       Margin="4,0,10,0" 
       IsSynchronizedWithCurrentItem="True" 
       ItemsSource="{Binding Source={StaticResource SyncOperationValues}}" 
          SelectedItem="{Binding Operation}" 
          VerticalAlignment="Center" /> 

... 

et ListBox:

<ListBox x:Name="SyncList" 
    ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
    ItemContainerStyle="{StaticResource StretchedContainerStyle}" 
    ItemTemplate="{StaticResource SyncListTemplate}"> 
ListBox> 

J'ai essayé quelques options différentes, comme la liaison à un CollectionView; Cependant, rien ne semble fonctionner. Quelqu'un peut-il me signaler mon erreur?

Merci!

Répondre

4

J'ai enfin trouvé une solution. J'ai fini par écrire un ValueConverter pour le type d'énumération. J'avais l'impression que ce n'était pas nécessaire, mais pour une raison quelconque, au moins si la ComboBox se trouve dans une autre liste (ListBox dans mon cas).

J'ai dû définir la propriété IsSynchronizedWithCurrentItem sur false comme John M l'a suggéré, donc merci à John pour ça! Voici le code du convertisseur au cas où quelqu'un d'autre aurait besoin de faire quelque chose comme ça.

[ValueConversion(typeof(SyncOperationEnum), typeof(String))] 
public class SyncOperationConverter : IValueConverter { 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     if(value != null && value.GetType() == typeof(SyncOperationEnum)) 
      return Enum.GetName(typeof(SyncOperationEnum), value); 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     if(value != null && targetType == typeof(SyncOperationEnum)) 
      foreach(object enumValue in Enum.GetValues(targetType)) 
       if(value.Equals(Enum.GetName(targetType, enumValue))) 
        return enumValue; 

     return null; 
    } 

    #endregion 

Et mon XAML ressemble maintenant à ceci:

<Window.Resources> 
    <local:SyncOperationConverter x:Key="SyncConverter" /> 

    <ObjectDataProvider x:Key="SyncOperationValues" 
        MethodName="GetNames" 
        ObjectType="{x:Type sys:Enum}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="local:SyncOperationEnum" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
... 
<DataTemplate x:Key="SyncListTemplate"> 
    <Grid Grid.Column="1" Grid.RowSpan="2" Margin="0,0,20,0" x:Name="olDetails" 
     DataContext="{Binding Path=OlContact}"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
     <RowDefinition /> 
     </Grid.RowDefinitions> 
... 
     <ComboBox x:Name="SyncOp" 
      Width="120" Height="19" 
      Margin="4,0,10,0" 
      IsSynchronizedWithCurrentItem="False" 
      ItemsSource="{Binding Source={StaticResource SyncOperationValues}}" 
      SelectedValue="{Binding Path=Operation,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Converter={StaticResource SyncConverter}}" 
      VerticalAlignment="Center" /> 
-1

Il semble que votre propriété "Operation" soit une propriété statique. Comme il se lier à chaque ComboBox lorsque vous changez, donc tout le reste est juste dans votre XAML juste faire la propriété comme ci-dessous

static SyncOperationEnum _operation; 

    public static SyncOperationEnum Operation 
    { 
     get { return _operation; } 
     set { _operation = value;} 
    } 
+0

"Opération" est une propriété d'instance sur l'objet ListBox lie à. Si je le change en statique, j'obtiens simplement une erreur de compilateur qui ne peut pas être accédée car ce n'est pas une propriété d'instance. – palehorse

+0

Je devrais noter - le ListBox lie à un ObservableCollecton des objets, chacun de ces objets contient la propriété Operation. – palehorse

7

J'ai eu une situation similaire à celle et définir la propriété IsSynchronizedWithCurrentItem sur le ComboBox " Faux "l'a réparé. La façon dont je le comprends, en définissant la valeur sur "True" signifie que la valeur ComboBox sera la valeur synchronisée de l'élément en cours pour le contrôle ListBox. Fondamentalement, tous les ComboBox sont liés à cette même valeur. On dirait que c'est ce que vous vivez. Essayez:

IsSynchronizedWithCurrentItem="False" 
+0

C'est plus proche. J'ai vérifié que le définir à False résout le problème; cependant, la raison pour laquelle je l'ai défini sur "True" est que lorsque la fenêtre apparaît pour la première fois, tous les ComboBox n'ont aucune valeur sélectionnée plutôt que la valeur de la propriété "Operation" à laquelle ils sont liés. – palehorse

+0

Essayez de vous lier à SelectedValue plutôt que SelectedItem sur le ComboBox –

+0

Juste essayé cela, il n'a pas résolu le problème. Toujours rien sélectionné. – palehorse

Questions connexes