4

カスタムタイプListBoxのにバインドされているフォームがあります。ObservableCollection各アイテム内にはComboBox、列挙型へのバインドがあります。ウィンドウがロードされると、すべてのComboBoxesがデフォルトで特定の値になります。いずれか1つを(コードからではなくUIから)変更すると、SelectedItem他のすべてのComboBoxesが同じに変更されSelectedItemます。

何が間違っているのかわかりません。これを処理している現在のXAMLは次のとおりです。

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

...

ListBox

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

CollectionView;へのバインドなど、いくつかの異なるオプションを試しました。しかし、何も機能していないようです。誰かが私の間違いを指摘できますか?

ありがとう!

4

3 に答える 3

7

これに似た状況があり、ComboBox の IsSynchronizedWithCurrentItem プロパティを「False」に設定すると修正されました。私が理解している方法では、値を「True」に設定すると、ComboBox の値が ListBox の現在の項目の値と同期されることを意味します。基本的に、すべての ComboBoxes は同じ値にバインドされます。それがあなたが経験していることのように聞こえます。試す:

IsSynchronizedWithCurrentItem="False"
于 2009-02-06T21:31:11.703 に答える
4

私は最終的に解決策を見つけました。列挙型の ValueConverter を作成することになりました。これは必要ないという印象を受けていましたが、何らかの理由で、少なくとも ComboBox が何らかの別のリスト (私の場合は ListBox) 内にある場合はそうです。

John M が提案したように、IsSynchronizedWithCurrentItem プロパティを false に設定する必要がありました。John に感謝します。他の誰かがこのようなことをする必要がある場合のコンバーターコードを次に示します。

[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

そして、私の XAML は次のようになります。

<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" />
于 2009-02-09T16:36:02.177 に答える
-1

「操作」プロパティは静的プロパティである必要があるようです。変更するとすべてのComboBoxにバインドされるため、XAML内の他のすべてが正しく、次のようなプロパティを作成するだけです。

    static SyncOperationEnum _operation;

    public static SyncOperationEnum Operation
    {
        get { return _operation; }
        set { _operation = value;}
    }
于 2009-02-06T20:53:45.507 に答える