一切都在标题中,我想做类似的事情:
<ListBox AssignTo="{Binding ListBoxControl}" ...
然后在我的 ViewModel 中具有这样的属性:
public ListBox CurrentListBox
{
get;
set;
}
我想要的是轻松检索所选项目
我可以这样做吗?
你的 xml 应该看起来像
<ListBox
ItemsSource="{Binding List}"
SelectedItem="{Binding Item}"/>
你的属性应该看起来像
private List<yourClass> list;
public List<yourClass> List
{
get { return list; }
set
{
list = value;
RaisPropertyChanged("List");
}
}
private yourClass item;
public yourClass Item
{
get { return item; }
set
{
item = value;
RaisPropertyChanged("Item");
}
}
现在您只需要将 ViewModle 设置为 DataContext 并且有很多方法可以做到这一点
我使用一种非常简单的方法来创建一个 ResourceDictionary (VMViews.xaml)
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:ProjectName.namespace"
xmlns:vw="clr-namespace:ProjectName.namespace" >
<DataTemplate DataType="{x:Type vm:YourVMName}">
<vw:YourVName/>
</DataTemplate>
</ResourceDictionary>
在我的 App.xaml
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Path/VMViews.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
(此代码未经测试)
XAML
<ListBox
ItemsSource="{Binding List}"
SelectedItem="{Binding Item}" SelectionChanged="ListBox_SelectionChanged">
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListBox.Resources>
</ListBox>
现在您yourClass
需要实现该IsSelected
属性
比你能做的事情
private yourClass item;
public yourClass Item
{
get { return item; }
set
{
item = value;
RaisPropertyChanged("Item");
SelectedItems = List.Where(listItem => listItem.IsSelected).ToList();
}
}
private List<yourClass> selectedItems;
public List<yourClass> SelectedItems
{
get { return selectedItems; }
set
{
selectedItems = value;
RaisPropertyChanged("SelectedItems");
}
}
另一个人在尝试学习时遇到了类似的问题......
您的属性通过公共 getter/setter 公开(尽管 setter 可以是您的数据上下文对象私有的)。
然后,列表框“Items”的属性将“绑定”到您的公开属性。