wpf - with - visual basic combobox items




Tutti i ComboBox in una ListBox cambiano quando uno qualsiasi di essi viene modificato (2)

Ho un ListBox su un modulo associato a ObservableCollection di un tipo personalizzato. All'interno di ogni elemento c'è un ComboBox associato a un tipo di enumerazione. Quando la finestra viene caricata, tutti i ComboBox sono impostati su un determinato valore. Quando cambio l'oggetto SelectedItem per uno (dall'interfaccia utente, non dal codice), tutti gli altri ComboBox modificati con lo stesso SelectedItem .

Non sono sicuro di cosa ho fatto di sbagliato, ecco il mio attuale XAML che sta gestendo questo.

<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" />

...

e il ListBox :

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

Ho provato alcune opzioni diverse, come il binding a un CollectionView ; tuttavia, niente sembra funzionare. Qualcuno può indicarmi il mio errore?

Grazie!


Sembra che la proprietà "Operazione" sia una proprietà statica. Dal momento che si lega a ogni ComboBox quando lo si cambia, quindi tutto il resto è giusto nel tuo XAML, basta rendere la proprietà simile a un muggito

    static SyncOperationEnum _operation;

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

Ho finalmente trovato una soluzione. Ho finito per scrivere un ValueConverter per il tipo di enumerazione. Avevo l'impressione che non fosse necessario, ma per qualche motivo lo è, almeno se il ComboBox si trova all'interno di un altro elenco (ListBox nel mio caso) di qualche tipo.

Avevo bisogno di impostare la proprietà IsSynchronizedWithCurrentItem su false come suggeriva John M, quindi grazie a John per quello! Ecco il codice del convertitore nel caso in cui qualcun altro debba fare qualcosa del genere.

[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

E il mio XAML ora si presenta così:

<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" />