UWP TreeView - 绑定后面的数据更新使可扩展图标消失 [英] UWP TreeView - Update of data behind a binding makes the Expandable icon to disappear

查看:19
本文介绍了UWP TreeView - 绑定后面的数据更新使可扩展图标消失的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 TreeView 我有一个 Patient 结构:

With a TreeView I have a Patient structure:

        private ObservableCollection<MTreeViewPaz> _Patients;

        public ObservableCollection<MTreeViewPaz> Patients
        {
            get { return _Patients; }
            private set { Set(ref _Patients, value); }
        }

和绑定到它的树视图:

            <winui:TreeView
                x:Name="treeView"
                Grid.Row="1"
                Expanding="treeView_Expanding"
                ItemInvoked="OnItemInvoked"
                ItemTemplate="{StaticResource ItemTemplate}"
                ItemsSource="{x:Bind Patients, Mode=OneWay}"
                SelectionMode="Single" />

使用项目模板:

        <DataTemplate x:Key="ItemTemplate" x:DataType="model:MTreeViewBase">
            <winui:TreeViewItem IsExpanded="False" ItemsSource="{x:Bind Visits}">
                <controls1:TreeViewControl Data="{x:Bind}" />
            </winui:TreeViewItem>
        </DataTemplate>

和自定义控件:

<UserControl
    x:Class="TitoDoc2020.Views.TreeViewControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="using:TitoDoc2020.Views"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:model="using:TitoDoc2020.Models"
    d:DesignHeight="300"
    d:DesignWidth="400"
    mc:Ignorable="d">

    <UserControl.Resources>

        <DataTemplate x:Name="PAZTemplate" x:DataType="model:MTreeViewPaz">
            <StackPanel Orientation="Horizontal">
                <FontIcon
                    Margin="{StaticResource XXSmallTopRightBottomMargin}"
                    FontFamily="{StaticResource SymbolThemeFontFamily}"
                    Glyph="&#xE77B;" />
                <TextBlock
                    Margin="{StaticResource XXSmallTopRightBottomMargin}"
                    VerticalAlignment="Center"
                    Text="{x:Bind Name}" />
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Name="VisitTemplate" x:DataType="model:MTreeViewVisit">
            <StackPanel Orientation="Horizontal">
                <FontIcon
                    Margin="{StaticResource XXSmallTopRightBottomMargin}"
                    FontFamily="{StaticResource SymbolThemeFontFamily}"
                    Foreground="{x:Bind ImageColor}"
                    Glyph="{x:Bind ImageSrc}" />
                <TextBlock
                    Margin="{StaticResource XXSmallTopRightBottomMargin}"
                    VerticalAlignment="Center"
                    Text="{x:Bind VisitDescr}" />
            </StackPanel>
        </DataTemplate>

    </UserControl.Resources>

    <Grid>
        <ContentControl x:Name="MainContent" />
    </Grid>

</UserControl>

然后我有 4 个 AppBarTogleButton 来选择患者的排序顺序.他们每个人都调用相同的过程:

I have then 4 AppBarTogleButton to select the sorting order of the Patients. Each of them invoke the same procedure:

        private async void AppBarToggleButton_Checked(object sender, RoutedEventArgs e)
        {
            string sorting = await ApplicationData.Current.LocalSettings.ReadAsync<string>("TreeViewSort");

            switch (((Windows.UI.Xaml.Controls.AppBarToggleButton)sender).Name)
            {
                case "DescDate":
                    if (sorting == "DescDate")
                    {
                        return;
                    }
                    AsceDate.IsChecked = false;
                    AsceAlph.IsChecked = false;
                    DescAlph.IsChecked = false;
                    break;
                case "AsceDate":
                    if (sorting == "AsceDate")
                    {
                        return;
                    }
                    DescDate.IsChecked = false;
                    AsceAlph.IsChecked = false;
                    DescAlph.IsChecked = false;
                    break;
                case "DescAlph":
                    if (sorting == "DescAlph")
                    {
                        return;
                    }
                    AsceDate.IsChecked = false;
                    DescDate.IsChecked = false;
                    AsceAlph.IsChecked = false;
                    break;
                case "AsceAlph":
                    if (sorting == "AsceAlph")
                    {
                        return;
                    }
                    AsceDate.IsChecked = false;
                    DescDate.IsChecked = false;
                    DescAlph.IsChecked = false;
                    break;
                default:
                    break;
            }
            await ApplicationData.Current.LocalSettings.SaveAsync("TreeViewSort", ((Windows.UI.Xaml.Controls.AppBarToggleButton)sender).Name);
            _sorting = ((Windows.UI.Xaml.Controls.AppBarToggleButton)sender).Name;
            await SortTreeAsync(false);
        }

在 SortTreeAsync 中:

and in the SortTreeAsync:

        private async Task SortTreeAsync(bool setCheck)
        {
            ObservableCollection<MTreeViewPaz> _patients;

            if (treeView.Visibility == Visibility.Collapsed)
            {
                return;
            }
            treeView.Visibility = Visibility.Collapsed;
            switch (_sorting)
            {
                case "DescDate":
                    if (setCheck) DescDate.IsChecked = true;
                    Patients = new ObservableCollection<MTreeViewPaz>(
                        from i in Patients orderby i.Data descending, i.Cognome, i.Nome select i);
/*                    await treeView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                       {
                           Patients = _patients;
                       });
 */
                    break;
                case "AsceDate":
                    if (setCheck) AsceDate.IsChecked = true;
                    Patients = new ObservableCollection<MTreeViewPaz>(
                        from i in Patients orderby i.Data, i.Cognome, i.Nome select i);
                    break;
                case "DescAlph":
                    if (setCheck) DescAlph.IsChecked = true;
                    Patients = new ObservableCollection<MTreeViewPaz>(
                        from i in Patients orderby i.Cognome descending, i.Nome descending, i.Data descending select i);
                    break;
                case "AsceAlph":
                    if (setCheck) AsceAlph.IsChecked = true;
                    Patients = new ObservableCollection<MTreeViewPaz>(
                        from i in Patients orderby i.Cognome, i.Nome, i.Data descending select i);
                    break;
                default:
                    DescDate.IsChecked = true;
                    break;
            }
            treeView.Visibility = Visibility.Visible;
            return;
        }

我用新排序的患者更新患者.问题是,在我更改排序顺序几次后,> 展开叶子消失了:

I update the Patients with the new sorted one. The issue is that after I change the sorting order couple of time the > to expand the leafs disapper:

我已经检查过,数据结构完全相同(除了顺序)并且正确

I've checked and the data structure is absolutely identical (apart from the order) and correct

这怎么可能?

--- 附加信息---

--- Additional info ---

如你所见,子结构仍然存在

As you can see the child structure is still there

推荐答案

UWP TreeView - 绑定后面的数据更新使可扩展图标消失

UWP TreeView - Update of data behind a binding makes the Expandable icon to disappear

请检查这一行 <winui:TreeViewItem IsExpanded="False" ItemsSource="{x:Bind Visits}">,您使用了 x:Bind OneTime不会响应 Visits 属性更改的模型,请使用 OneWayTwoWay 模型编辑它,请确保您已调用 OnPropertyChanged 事件访问属性.

Please check this line <winui:TreeViewItem IsExpanded="False" ItemsSource="{x:Bind Visits}">, you used x:Bind OneTime model that will not response Visits property changed, please edit it with OneWay or TwoWay model and please sure you have call OnPropertyChanged event for Visits property.

这篇关于UWP TreeView - 绑定后面的数据更新使可扩展图标消失的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆