我有一个概览页,其中包含多个灵活布局模板,用于报表地区的不同汇总。该页上有一个选择器,用于在用户选择特定地区时筛选显示的报表。在概览页上,每个地区或"所有地区"的筛选工作正常。用户可以点击报表以查看其详细信息并定位至详细信息页。当用户导航回概览页面时,我将刷新整个数据集(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;
}
}
1条答案
按热度按时间lawou6xi1#
经过大量的研究,我发现我的问题归结为我将App.CurrTerritory对象分配给SelectedItem对象(SelectedItem = App.CurrTerritory;)。选取器的ItemSource是Territory对象的列表,SelectedItem对象绑定到选取器的SelectedItem属性。因为我在每次刷新时都会刷新地区列表,所以即使各个属性相等,App.CurrTerritory也不再等于(==)列表中的任何对象。因此,我在前面比较了CurrTerritory的string属性。Territory添加到列表中的每个区域对象。找到匹配项后,我将App. CurrTerritory重置为列表中找到的新对象,现在列表中确实存在一个对象。(仅供参考- _curr是当前App.CurrTerritory属性的字符串值)
刷新全局属性App.Currterritory
现在,对SelectedItem的赋值将在列表中有一个obj
希望这对任何偶然发现这个案子的人有帮助