我正在尝试将ListBox
绑定到同一窗口中的另一个ListBox
。左侧的Listbox
包含可以选择的数据。但我希望用户能够点击左侧列表框中的项目,并且那些相同的项目将显示在右侧的其他列表框中。
答案 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
属性中的名称绑定到该控件。
例如,有两个列表框和一个文本框。顶部列表框具有多选项,这些选项显示在下方列表框中。虽然文本框只能选择第一个项目。
<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}}。