将列表视图的项的选定状态绑定到模型的布尔属性的最简单方法是什么?
我有一个模型:
class Model {
public string Name { get; set; }
public bool Selected { get; set; }
}和listview:
<ListView x:Name="myListView" SelectionMode="Multiple">
<ListView.ItemTemplate>
<DataTemplate x:DataType="x:String">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
我将项目绑定到列表视图:
myListView.ItemsSource = // list of Model instances我希望模型的Selected属性始终反映它在myListView中是否处于选中状态。So -通过选择/取消选择myListView中的项目,它将保留适当的布尔值,或者通过设置Selected属性,myListView将选择/取消选择适当的项目。
发布于 2016-10-13 15:44:29
将列表视图的项的选定状态绑定到模型的布尔属性的最简单方法是什么?
我不确定这是否是最简单的方法,但对我来说,我认为这是将ListViewItem的SelectorItem.IsSelected property绑定到模型中的Selected属性的最简单方法。唯一的问题是,我们都知道ListView的每一项都是ListViewItem的一个实例,但是当我们使用DataTemplate为ListViewItem构建项结构时,ListViewItem在设计时不可用。所以我的想法是在后台代码中绑定这个属性,例如:
<ListView x:Name="myListView" SelectionMode="Multiple" Loaded="myListView_Loaded" ItemsSource="{x:Bind Collection}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>代码隐藏:
private ObservableCollection<Model> Collection = new ObservableCollection<Model>();
protected override void OnNavigatedTo(NavigationEventArgs e)
{
for (int i = 0; i < 100; i++)
{
Collection.Add(new Model { Name = "Name " + i });
}
}
private void myListView_Loaded(object sender, RoutedEventArgs e)
{
IEnumerable<ListViewItem> lvItems = FindVisualChildren<ListViewItem>(myListView);
if (lvItems != null)
{
foreach (ListViewItem lvitem in lvItems)
{
Model model = lvitem.Content as Model;
Binding b = new Binding
{
Source = model,
Path = new PropertyPath("Selected"),
Mode = BindingMode.TwoWay,
};
BindingOperations.SetBinding(lvitem, ListViewItem.IsSelectedProperty, b);
}
}
}
private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
public class Model : INotifyPropertyChanged
{
public string Name { get; set; }
private bool _Selected;
public bool Selected
{
get { return _Selected; }
set
{
if (value != _Selected)
{
_Selected = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName]string propertyName = "")
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}发布于 2016-10-13 00:07:51
我认为最好的方法是实现ListView.ItemSelectionChanged事件,并遍历列表视图模型中的每个项目,以便为选中的项目设置为true,为其余的项目设置为false。
然而,你可能想尝试这样的东西,尽管老实说我不确定这是否是正确的方法:
class Model {
public string Name { get; set; }
public bool Selected
{
get
{
return MyListView.SelectedItems.Count(x => x.Name == Name) > 0;
}
}
}https://stackoverflow.com/questions/40001554
复制相似问题