XAML 如何强制选取器在数据刷新后显示对象

r55awzrz  于 2023-03-06  发布在  其他
关注(0)|答案(1)|浏览(113)

我有一个概览页,其中包含多个灵活布局模板,用于报表地区的不同汇总。该页上有一个选择器,用于在用户选择特定地区时筛选显示的报表。在概览页上,每个地区或"所有地区"的筛选工作正常。用户可以点击报表以查看其详细信息并定位至详细信息页。当用户导航回概览页面时,我将刷新整个数据集(API & DB之旅),然后根据之前的选择重新过滤。这工作得很好。但我遇到的问题是我无法让选择器显示之前选择的地区。在刷新数据的同时,我也刷新了地区列表。选择器的ItemSource和ItemDisplayBinding被设置为一个对象。当用户选择一个地区时,我设置了一个全局属性(CurrTerritory)添加到选取器的对象(两者类型相同)。选取器的SelectedItem绑定到视图模型中的属性在完成数据刷新之后,我将vm.SelectedItem设置为CurrTerritory对象,希望选择器将显示先前选择的地区,但事实并非如此。所以任何帮助都将不胜感激。采摘者

<Picker x:Name="territoryPicker" 
                ItemsSource="{Binding Territories}" ItemDisplayBinding="{Binding Territory}"
                Title="Choose a Territory"
                WidthRequest="275"
                SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
                FontSize="Small"                          
                HorizontalOptions="StartAndExpand" 
                SelectedIndexChanged="territoryPicker_SelectedIndexChanged" />

代码隐藏

private void territoryPicker_SelectedIndexChanged(object sender, EventArgs e)
    {
        Territories _terr = territoryPicker.SelectedItem as Territories;

        if (_terr != null)
        {
            if (App.CurrTerritory.Territory != _terr.Territory)
            {
                App.CurrTerritory = _terr;
                if (App._AppStart) return;

                if (App.CurrTerritory.Territory.StartsWith( "All Territories") )
                {
                    overviewviewmodel.ResetFilter(App.ShowOnlyUserRequests);
                }
                else
                {
                    overviewviewmodel.Filter(App.CurrTerritory.Territory, App.ShowOnlyUserRequests);
                }
            }
            if(BindingContext == null)
                BindingContext = overviewviewmodel;
        }
    }

Viewmodel这里有很多内容,我只是显示设置SelectedItem的主要位置。在调用CheckFilters方法之前,所有数据都已刷新。

static Territories _SelectedItem; 
    public Territories SelectedItem 
    {
        get { return _SelectedItem; } 
        set 
        { 
                _SelectedItem = value; 
            OnPropertyChanged("SelectedItem"); 
        }
    }

        public void CheckFilters()
    {
        if (App.CurrTerritory != null && !App.CurrTerritory.Territory.StartsWith( "All Territories" ))
        {
            Filter(App.CurrTerritory.Territory.ToString(), App.ShowOnlyUserRequests);
            SelectedItem = App.CurrTerritory;
        }
        else
        {
            ResetFilter(App.ShowOnlyUserRequests);
            SelectedItem = App.CurrTerritory;
        }
    }
lawou6xi

lawou6xi1#

经过大量的研究,我发现我的问题归结为我将App.CurrTerritory对象分配给SelectedItem对象(SelectedItem = App.CurrTerritory;)。选取器的ItemSource是Territory对象的列表,SelectedItem对象绑定到选取器的SelectedItem属性。因为我在每次刷新时都会刷新地区列表,所以即使各个属性相等,App.CurrTerritory也不再等于(==)列表中的任何对象。因此,我在前面比较了CurrTerritory的string属性。Territory添加到列表中的每个区域对象。找到匹配项后,我将App. CurrTerritory重置为列表中找到的新对象,现在列表中确实存在一个对象。(仅供参考- _curr是当前App.CurrTerritory属性的字符串值)

foreach (var territory in filteredTerritory) 
        {
            Territories.Add(territory);
            if(territory.Territory == _curr)
                _territory = territory;
        }

刷新全局属性App.Currterritory

if(!App.CurrTerritory.Territory.StartsWith("All Territories"))
            App.CurrTerritory = _territory;

现在,对SelectedItem的赋值将在列表中有一个obj

SelectedItem = App.CurrTerritory;

希望这对任何偶然发现这个案子的人有帮助

相关问题