代码之家  ›  专栏  ›  技术社区  ›  palehorse

列表框中的所有组合框在任何1个组合框更改时都会更改

  •  4
  • palehorse  · 技术社区  · 15 年前

    我有一个 ListBox 在绑定到 ObservableCollection 自定义类型。每个项目中都有一个 ComboBox 绑定到枚举类型。当窗口加载时,所有 组合框 es默认为某个值。当我改变 SelectedItem 对于任何一个(来自UI,而不是来自代码),所有其他 组合框 ES变为相同 选择项目 .

    我不确定我做错了什么,这是我目前处理这个问题的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 x:Name="SyncList"
         ScrollViewer.HorizontalScrollBarVisibility="Hidden"
         ItemContainerStyle="{StaticResource StretchedContainerStyle}"
         ItemTemplate="{StaticResource SyncListTemplate}">
     ListBox>
    

    我尝试了一些不同的选择,比如绑定到 CollectionView 但似乎什么都没用。有人能指出我的错误吗?

    谢谢!

    3 回复  |  直到 13 年前
        1
  •  7
  •   John Myczek    15 年前

    我遇到了类似的情况,将组合框上的IsSynchronizedWithCurrentItem属性设置为“false”将其修复。据我了解,将值设置为“true”意味着组合框值将是列表框当前项的同步值。基本上,所有组合框都绑定到相同的值。听起来这就是你所经历的。尝试:

    IsSynchronizedWithCurrentItem="False"
    
        2
  •  4
  •   palehorse    15 年前

    我终于找到了解决办法。我最后为枚举类型编写了一个ValueConverter。我一直认为这是不必要的,但出于某种原因,至少如果组合框在某种类型的另一个列表(在我的例子中是列表框)中,是这样的。

    我确实需要按照约翰M的建议将IsSynchronizedWithCurrentItem属性设置为false,所以多亏了约翰!这里是转换器代码,以防其他人需要这样做。

    [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" />
    
        3
  •  -1
  •   Jobi Joy    15 年前

    看起来您的“operation”属性应该是静态属性。因为当你改变它时,它绑定到每一个组合框, 所以在你的XAML中,其他的一切都是正确的,只需使属性像下面这样

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