如何更新WPF中列表框中的组合框绑定?
问题描述:
我有一个列表框绑定到一个ObservableCollection,并在ListBox.ItemTemplate里有一个绑定到另一个ObservableCollection的组合框。如何更新WPF中列表框中的组合框绑定?
我需要的是在保存ListBox数据后更新这些ComboBoxes。
这里是我的XAML:
<ListBox Name="listBox" HorizontalContentAlignment="Stretch" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding KeyValues, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderThickness="1" BorderBrush="Gray" CornerRadius="4" Margin="0,1,1,1" Background="#EEE">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" />
<ColumnDefinition Width="3*" />
<ColumnDefinition Width="70" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="1" Margin="0,1">Value</Label>
<TextBox Grid.Column="2" Margin="0,1" Text="{Binding Path=Value}" />
<Label Grid.Column="3" Margin="0,1">Combo 1</Label>
<ComboBox Grid.Column="4" Margin="0,1" SelectedValue="{Binding Path=Combo1}" SelectedValuePath="Key" DisplayMemberPath="Value" ItemsSource="{Binding SelectableKeyValues, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
,并在这里的C#代码的特性:
public ObservableCollection<KeyValue> _KeyValues = null;
public ObservableCollection<KeyValue> KeyValues
{
get
{
if (_KeyValues == null)
{
// _KeyValues = ... (Database call)
}
return _KeyValues;
}
}
public ObservableCollection<KeyValue> _SelectableKeyValues = null;
public ObservableCollection<KeyValue> SelectableKeyValues
{
get
{
if (_SelectableKeyValues == null)
{
// _SelectableKeyValues = ... (Database call)
}
return _SelectableKeyValues;
}
}
一个调用的方法保存后:
public void RefreshData()
{
listBox.Items.Refresh();
_SelectableKeyValues = null;
}
我也尝试过了手动重新加载集合,但结果总是一样的:
在ComboBox我从来没有找到新的元素(我相信有)
我究竟做错了什么?
答
一种方法是在您的UserControl(包含SelectableKeyValues定义的类)中实现INotifyPropertyChanged接口,并在RefreshData方法内使用“SelectableKeyValues”作为事件参数构造函数参数引发PropertyChanged事件。 使用ObservableCollection不会帮助你在这种情况下,因为你不改变集合,但取而代之。 让我们知道,如果你需要代码示例
+0
完美!谢谢,我不知道UserControl有一个“已处理”属性changed – p4bl0 2012-04-02 13:25:55
只是一个快速的提示,设置Mode = TwoWay您的组合框项目源绑定 – michele 2012-04-02 13:07:07
不起作用,因为它是一个只读属性。 – p4bl0 2012-04-02 13:24:15