我正在尝试访问SelectedItem以及绑定到ItemsControl内嵌套ListBox的命令。下面是简化的XAML。
<ItemsControl ItemsSource="{Binding Collection}"
ItemTemplate="{StaticResource Partials}"
</ItemsControl>
<DataTemplate x:Key="Partials">
<ListBox ItemsSource="{Binding ListBoxItems}"
SelectedItem="{Binding SelectedItem}" >
<ListBox.InputBindings>
<KeyBinding Key="Delete" Command="{Binding DeleteSelectedItemCommand/>
</ListBox.InputBindings>
</ListBox>
</DataTemplate>
这就是我在虚拟机中所拥有的(简化)
private void FillList()
{
//Populate the list
Collection.Add(Data);
var ListBoxViewSource = new CollectionViewSource { Source = ListBoxDataSource};
Collection.ListBoxItems= ListBoxViewSource.View;
}
private ObservableCollection<Scene> _collection= new ObservableCollection<Scene>();
public ObservableCollection<Scene> Collection
{
get { return _collection; }
set
{
if (value != _collection)
{
_collection= value; RaisePropertyChanged();
}
}
}
private string _selectedItem;
public string SelectedItem
{
get { return _selectedItem; }
set { _selectedItem= value; RaisePropertyChanged(); }
}
public RelayCommand DeleteSelectedItemCommand { get; private set; }
private void DeleteSelectedItem()
{
SourceData.Remove(SelectedItem);
}
如何在列表框中获取SelectedItem的值?
答案 0 :(得分:0)
要获取SelectedItem,您必须在DataContext类中使用属性。
您正在使用ListBoxes作为项目,因此您必须在内部DataContext中声明一个属性。
您还可以在ItemsControl级别使用RoutedEvent(ListBox.SelectionChanged)从ListBox获取SelectedValue。
示例:
视图模型
public class StateVM
{
public List<CountryStates> Collection { get; set; }
public StateVM() { Collection = new List<CountryStates>(); }
}
public class CountryStates
{
public string SelectedState { get; set; } /* SelectedItem will arrive here */
public string Name { get; set; }
public List<string> States { get; set; }
}
XAML
<DataTemplate x:Key="Partials">
<ListBox ItemsSource="{Binding States}" SelectedValue="{Binding SelectedState}">
<ListBox.InputBindings>
<KeyBinding Key="Delete" Command="{Binding DeleteSelectedItemCommand}"/>
</ListBox.InputBindings>
</ListBox>
</DataTemplate>
<ItemsControl x:Name="CountryStateList" ItemsSource="{Binding Collection}"
ListBox.SelectionChanged="ListBox_SelectionChanged"
ItemTemplate="{StaticResource Partials}">
</ItemsControl>
代码隐藏
StateVM vm = new StateVM();
vm.Collection.Add(new CountryStates() { Name = "India", States = new[] { "mp", "up", "tn" }.ToList() });
vm.Collection.Add(new CountryStates() { Name = "USA", States = new[] { "new york", "washington" }.ToList() });
CountryStateList.DataContext = vm;
...
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBox source = (ListBox)(e.OriginalSource);
System.Diagnostics.Debug.WriteLine(">>>>>> " + ((CountryStates)(source.DataContext)).SelectedState);
}