Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin C#绑定双嵌套集合以切换代码中的IsToggledProperty_C#_Xamarin_Collections_Binding_Nested - Fatal编程技术网

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);