ListBox 中的所有 ComboBox 在其中任何一个更改时都会更改
Posted
技术标签:
【中文标题】ListBox 中的所有 ComboBox 在其中任何一个更改时都会更改【英文标题】:All ComboBoxes in a ListBox change when any 1 of them is changed 【发布时间】:2010-10-06 00:51:47 【问题描述】:我在绑定到自定义类型的ObservableCollection
的表单上有一个ListBox
。在每个项目中都有一个ComboBox
绑定到一个枚举类型。当窗口加载时,所有ComboBox
es 都默认为某个值。当我为任何一个更改 SelectedItem
时(从 UI,而不是从代码),所有其他 ComboBox
es 都更改为相同的 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
;但是似乎没有任何效果。谁能指出我的错误?
谢谢!
【问题讨论】:
【参考方案1】:看起来您的“操作”属性应该是静态属性。由于它在您更改时绑定到每个 ComboBox, 因此,您的 XAML 中的所有其他内容都是正确的,只需将属性设置为如下所示
static SyncOperationEnum _operation;
public static SyncOperationEnum Operation
get return _operation;
set _operation = value;
【讨论】:
"Operation" 是 ListBox 绑定到的对象的实例属性。如果我将其更改为静态,我只会得到一个编译器错误,因为它不是实例属性,因此无法访问它。 我应该注意 - ListBox 绑定到对象的 ObservableCollecton我遇到了类似的情况,将 ComboBox 上的 IsSynchronizedWithCurrentItem 属性设置为“False”修复了它。我理解它的方式,将值设置为“True”意味着 ComboBox 值将是 ListBox 的当前项的同步值。基本上,所有 ComboBoxes 都绑定到相同的值。听起来这就是你正在经历的。试试:
IsSynchronizedWithCurrentItem="False"
【讨论】:
这更近了。我验证将其设置为 False 可以解决问题;但是,我将其设置为“True”的原因是,当 Window 首次出现时,所有 ComboBoxes 都没有选择值,而是它们绑定到的“Operation”属性的值。 尝试绑定到 SelectedValue 而不是 ComboBox 上的 SelectedItem 刚刚试了一下,并没有解决问题。仍然没有选择任何内容。【参考方案3】:我终于找到了解决办法。我最终为枚举类型编写了一个 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" />
【讨论】:
以上是关于ListBox 中的所有 ComboBox 在其中任何一个更改时都会更改的主要内容,如果未能解决你的问题,请参考以下文章
让 ListBox 中的项目取决于在 ComboBox 中选择了哪个项目
ListBox 内的 DataContext ComboBox 绑定