从一个ListBox绑定到另一个ListBox?

时间:2016-02-22 00:15:00

标签: c# wpf xaml data-binding listbox

我正在尝试将ListBox绑定到同一窗口中的另一个ListBox。左侧的Listbox包含可以选择的数据。但我希望用户能够点击左侧列表框中的项目,并且那些相同的项目将显示在右侧的其他列表框中。

2 个答案:

答案 0 :(得分:2)

EDITED:当然你可以使用Dependency Property将UI属性绑定到另一个UI属性(实际上是ElementName),但我建议将属性绑定到一个视图模型。请参阅下面的简化示例。

查看型号:

public ObservableCollection<ItemObject> Items  { get; set; }
public ObservableCollection<ItemObject> SelectedItems { get; set; }

左:

<ListBox ItemsSource="{Binding Items}" SelectedItems="{Binding SelectedItems}" />

(请注意,实际上没有SelectedItems依赖项属性。请参阅问题:Select multiple items from a DataGrid in an MVVM WPF project

右:

<ListBox ItemsSource="{Binding SelectedItems}" />

这很好用。此外,通过这种方法,可以轻松定制右侧的列表(例如,使用CollectionView订购,过滤,...)。

private ICollectionView _collectionView;
private ICollectionView _CollectionView {
    get { return _collectionView
        ?? (_collectionView = CollectionViewSource.GetDefaultView(SelectedItems)); }
}
public ICollectionView FilteredItems { 
    get { _CollecitionView.Filter(...); }
}

<ListBox ItemsSource={"Binding FilteredSelectedItems"} />

这样的MVVM方法有时是费力的,但最终被认为是有益的。

答案 1 :(得分:1)

您命名第一个列表框,然后xaml上的任何其他控件将使用绑定的ElementName属性中的名称绑定到该控件。

例如,有两个列表框和一个文本框。顶部列表框具有多选项,这些选项显示在下方列表框中。虽然文本框只能选择第一个项目。

enter image description here

<StackPanel Orientation="Vertical">
    <StackPanel.Resources>
        <converters:PathToFilenameConverter x:Key="FilenameConverter" />
        <x:Array x:Key="FileNames" Type="system:String">
            <system:String>C:\Temp\Alpha.txt</system:String>
            <system:String>C:\Temp\Beta.txt</system:String>
            <system:String>C:\Temp\Gamma.txt</system:String>
        </x:Array>
    </StackPanel.Resources>

    <ListBox  Name="lbFiles"
              SelectionMode="Multiple"
              ItemsSource="{StaticResource FileNames}"
              Margin="10"/>

    <ListBox ItemsSource="{Binding SelectedItems, ElementName=lbFiles }"  Margin="10" />

    <TextBlock Text="{Binding SelectedItem, 
                      ElementName=lbFiles,
                      Converter={StaticResource FilenameConverter}}"
               Margin="10" />

</StackPanel>

注意......代码使用下方列表框的SelectedItems属性绑定,而不是SelectedItem使用的TextBlock

顺便说一下,另一个答案是使用ObservableCollection,除非数组是动态变化的,否则不需要INotifyPropertyChanged;否则可以使用任何数组。根据加载,例如来自VM,可能需要遵守{{1}}。