首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UWP列表视图绑定

UWP列表视图绑定
EN

Stack Overflow用户
提问于 2016-10-12 22:42:33
回答 2查看 3.6K关注 0票数 1

将列表视图的项的选定状态绑定到模型的布尔属性的最简单方法是什么?

我有一个模型:

代码语言:javascript
复制
class Model {
    public string Name { get; set; }
    public bool Selected { get; set; }
}

和listview:

代码语言:javascript
复制
<ListView x:Name="myListView" SelectionMode="Multiple">
<ListView.ItemTemplate>
    <DataTemplate x:DataType="x:String">
        <TextBlock Text="{Binding Name}"/>
    </DataTemplate>
</ListView.ItemTemplate>

我将项目绑定到列表视图:

代码语言:javascript
复制
myListView.ItemsSource = // list of Model instances

我希望模型的Selected属性始终反映它在myListView中是否处于选中状态。So -通过选择/取消选择myListView中的项目,它将保留适当的布尔值,或者通过设置Selected属性,myListView将选择/取消选择适当的项目。

EN

回答 2

Stack Overflow用户

发布于 2016-10-13 15:44:29

将列表视图的项的选定状态绑定到模型的布尔属性的最简单方法是什么?

我不确定这是否是最简单的方法,但对我来说,我认为这是将ListViewItemSelectorItem.IsSelected property绑定到模型中的Selected属性的最简单方法。唯一的问题是,我们都知道ListView的每一项都是ListViewItem的一个实例,但是当我们使用DataTemplateListViewItem构建项结构时,ListViewItem在设计时不可用。所以我的想法是在后台代码中绑定这个属性,例如:

代码语言:javascript
复制
<ListView x:Name="myListView" SelectionMode="Multiple" Loaded="myListView_Loaded" ItemsSource="{x:Bind Collection}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

代码隐藏:

代码语言:javascript
复制
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));
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2016-10-13 00:07:51

我认为最好的方法是实现ListView.ItemSelectionChanged事件,并遍历列表视图模型中的每个项目,以便为选中的项目设置为true,为其余的项目设置为false。

然而,你可能想尝试这样的东西,尽管老实说我不确定这是否是正确的方法:

代码语言:javascript
复制
class Model {
    public string Name { get; set; }
    public bool Selected 
    {
        get
        {
            return MyListView.SelectedItems.Count(x => x.Name == Name) > 0;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40001554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档