Xamarin C#绑定双嵌套集合以切换代码中的IsToggledProperty
我想绑定Xamarin C#绑定双嵌套集合以切换代码中的IsToggledProperty,c#,xamarin,collections,binding,nested,C#,Xamarin,Collections,Binding,Nested,我想绑定Switch.IsToggledProperty以使用选项BindingMode.TwoWay查看模型的双嵌套集合属性。在某种程度上,从控件到视图模型的绑定工作得很好,但当我更新视图模型控件中的属性时,该控件的值不会改变。视图模型实现了INotifyPropertyChanged 以下是一些最重要的代码: 查看模型的属性(尝试使用2个数组,但仍然不起作用): 代码中的数据更改示例(视图模型): 编辑2以更好地复制: 下面是CategoriesList的工作原理。CategoriesLis
Switch.IsToggledProperty
以使用选项BindingMode.TwoWay
查看模型的双嵌套集合属性。在某种程度上,从控件到视图模型的绑定工作得很好,但当我更新视图模型控件中的属性时,该控件的值不会改变。视图模型实现了INotifyPropertyChanged
以下是一些最重要的代码:
查看模型的属性(尝试使用2个数组,但仍然不起作用):
代码中的数据更改示例(视图模型):
编辑2以更好地复制:
下面是CategoriesList的工作原理。CategoriesList是UniversalSwitchViewModel字典的字典,其中第一个键存储区域id(我有多个带多个开关的区域)。CategoriesList[regionId](示例:CategoriesList[0])为我们提供了交换机列表ViewModels,其中键是从服务器下载的每个类别的名称(不要存储在此位置DisplayName)。CategoriesList[regionId][CategorinNameof](示例:CategoriesList[0][折扣])返回UniversalSwitchViewModel,该模型存储开关值(bool)和id,以更新服务器上的数据并保存设备上的设置
通过在绑定表达式I中回复@Jack Hua-MSFT comment这部分代码,我将从服务器(或设置)下载的每个类别绑定到属性中的视图模型,其中CategoriesList是交换机视图模型的存储库。regionId是从选择器中选择的当前区域Id,您可以假定它等于0,并且CategoriesList具有dictionary CategoriesList[0]。categoryNameOf是category.NameOf其中category是服务器设置中的项,您可以假设如果绑定CategoriesList[0][xyz],则CategoriesList包含CategoriesList[0][xyz],它返回您的样本UniversalSwitchViewModel,Id=0(可以是任意int),值=true(检查是否有效更简单)
最后一个示例:您可以绑定:
checkbox.SetBinding(Switch.IsToggledProperty, "CategoriesList[0].Value[xyz].Value", BindingMode.TwoWay);
而且它只作为从视图到视图模型的单向binding工作,所以我假设绑定表达式是好的
我很乐意接受任何建议
编辑3:
您能为我们提供一份详细的报告吗?这里的
区域ID
、类别名称和分类列表是什么,我目前无法重现代码的问题。更新帖子。现在应该足以更好地理解这个问题。很抱歉数据太差,但这是第一篇文章,因为我一直在尝试,能够找到解决方案,而无需任何自定义问题。感谢更新,我稍后将再次检查:)。好的,在创建一些数据后,我可以重现问题。虽然我还没有找到解决办法。您可以在中创建一个问题以获得更多帮助,如果发现任何问题,我将更新您。我会这样做,并将在github上上载示例项目以下载它。我的同伴用WPF检查了这个问题,同样的问题也存在。你能给我们提供一个答案吗?这里的区域ID
、类别名称和分类列表是什么,我目前无法重现代码的问题。更新帖子。现在应该足以更好地理解这个问题。很抱歉数据太差,但这是第一篇文章,因为我一直在尝试,能够找到解决方案,而无需任何自定义问题。感谢更新,我稍后将再次检查:)。好的,在创建一些数据后,我可以重现问题。虽然我还没有找到解决办法。您可以在中创建一个问题以获得更多帮助,如果发现任何问题,我将更新您。我会这样做,并将在github上上载示例项目以下载它。我的同伴用WPF检查了这个问题,同样的问题也存在。
var checkbox = new Switch { VerticalOptions = LayoutOptions.Center, HorizontalOptions = LayoutOptions.Center };
//it works well only from View to View Model's property
checkbox.SetBinding(Switch.IsToggledProperty, $"{nameof(_pageViewModel.CategoriesList)}[{regionId}].Value[{categoryNameOf}].{nameof(UniversalSwitchViewModel.Value)}", BindingMode.TwoWay);
public void SetCategoriesOption(Dictionary<string, int> categories, int regionId)
{
foreach (var item in categories)
{
CategoriesList[regionId][item.Key].Value = true;
}
CategoriesList = CategoriesList;
//this.OnPropertyChanged(nameof(CategoriesList)); to be 100% sure I tried to run OnPropertyChanged event manually, but ofc it doesn't change anything
}
private Dictionary<string, UniversalPickerViewModel> _selectedEnumsSettings;
public Dictionary<string, UniversalPickerViewModel> SelectedEnumSettings
{
get
{
return _selectedEnumsSettings;
}
set
{
SetProperty(ref _selectedEnumsSettings, value);
}
}
checkbox.SetBinding(Switch.IsToggledProperty, $"{nameof(_pageViewModel.SelectedEnumSettings)}[{enumSettingKey}].{nameof(UniversalSwitchViewModel.Value)}", BindingMode.TwoWay);
public class UniversalSwitchViewModel
{
public long Id { get; set; }
public bool Value { get; set; }
}
checkbox.SetBinding(Switch.IsToggledProperty, "CategoriesList[0].Value[xyz].Value", BindingMode.TwoWay);