4

我有一个ListBox绑定到ObservableCollection自定义类型的表单。在每个项目中都有ComboBox一个枚举类型的绑定。窗口加载时,所有ComboBoxes 都默认为某个值。当我SelectedItem为任何一个(从 UI,而不是代码)更改 es 时,所有其他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>

我尝试了一些不同的选项,例如绑定到 a 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 回答