如何将字典绑定到 Listview itemsource

how to bind dictionary to Listview itemsource

提问人:Ashwini Shetty 提问时间:8/7/2019 最后编辑:barbsanAshwini Shetty 更新时间:8/8/2019 访问量:1530

问:

我有一个如下所示。 如何绑定字典,使我的标签作为键和ENtry具有价值?ListViewListViewItemsource

我不知道如何进一步进行

我尝试过这个,但我得到空引用异常

<ListView x:Name="ItemsListView" VerticalOptions="FillAndExpand" SeparatorVisibility="None" HasUnevenRows="true" ItemsSource="{Binding dictionary}">
  <ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell>
        <Grid>
          <Label Text="{Binding Key}" Grid.Row="1" Grid.Column="0" Style="{DynamicResource lblTitle}" />
          <Entry x:Name="test" Text="{Binding Value}" Grid.Row="1" Grid.Column="1" />
        </Grid>

      </ViewCell>

    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

查看模型

public List<string> Key
{
    get { return key; }
    set
    {
        SetProperty(ref key, value);

    }
}

public List<Int32> Value
{
    get { return val; }
    set
    {
        SetProperty(ref val, value);
    }
}**

for (int i = 0; i < AllProductsList.Count; i++)
{
    Value.Add(0);
    //Value = new ObservableCollection<Int32>(val);
}

for (int j = 0; j < AllProductsList.Count; j++)
{
    for (int k = 0; k < Value.Count; k++)
    {
        if (j == k)
        {
            dictionary[Key[j]] = Value[k];
        }
    }
表单 Xamarin NullReferenceException

评论

0赞 Ashwini Shetty 8/7/2019
例如,预期结果。项目 1 10 项目 2 20 项目 3 30 项目 4 40 列表计数将根据要求动态更改
1赞 Cheesebaron 8/7/2019
如果收到 NullReferenceException,请包含堆栈跟踪,以便我们帮助您缩小代码失败部分的范围
0赞 barbsan 8/7/2019
你在哪里初始化?这些循环在哪里?dictionaryfor
0赞 Junior Jiang 8/8/2019
什么类型的源数据,你能展示一下吗?也许你可以将源数据转换为ViewModel,可以直接在ListView中使用。

答:

0赞 DGN 8/7/2019 #1

如果 ItemSource 是字典,则只需绑定“Key”和“Value”即可。我想这就是你所做的。但是,您不需要创建属性“Key”和“Value”。所以请删除它..

//Remove these Properties
    public List<string> Key
            {
                get { return key; }
                set
                {
                    SetProperty(ref key, value);

                }
            }
            public List<Int32> Value
            {
                get { return val; }
                set
                {
                    SetProperty(ref val, value);

                }
            }**

您在 Xaml 中所做的操作是正确的。

<Grid>
      <Label Text="{Binding Key}" Grid.Row="1" Grid.Column="0" Style="{DynamicResource lblTitle}" />
      <Entry x:Name="test" Text="{Binding Value}" Grid.Row="1" Grid.Column="1" />
    </Grid>

Label 将显示 Keys,Entry 将显示值。现在,将列表绑定的 ItemSource 设置为字典(而不是 IList/List)。 如果设置了 ,则可以像绑定 Key 和 Value 一样(前提是 YourDictionary 的类型为 )。ItemSource= "{Binding YourDictionary}"Dictionary<string,string>

评论

0赞 Ashwini Shetty 8/7/2019
你能分享一个代码如何绑定标签和条目归档吗
1赞 Ashwini Shetty 8/8/2019
谢谢。。它正在工作..但是当我在输入字段中输入值并单击提交按钮时。我希望输入的值相对于键存储在字典中。
1赞 Junior Jiang 8/8/2019 #2

因为不知道源数据是什么类型,如果源数据是来自 Web API 的 json 类型,可以参考此讨论将 json 对象转换为 ViewMidel。

在 ListView 中,ItemSource 可以按如下方式使用:

词典模型.cs

public class DictionaryModel : INotifyPropertyChanged
{
    string key= string.Empty;
    public string Key
    {
        get { return key; }
        set { SetProperty(ref key, value); }
    }

    Int32 valueint = 0;
    public Int32 Value
    {
        get { return valueint; }
        set { SetProperty(ref valueint, value); }
    }

     protected bool SetProperty<T>(ref T backingStore, T value,
        [CallerMemberName]string propertyName = "",
        Action onChanged = null)
    {
        if (EqualityComparer<T>.Default.Equals(backingStore, value))
            return false;

        backingStore = value;
        onChanged?.Invoke();
        OnPropertyChanged(propertyName);
        return true;
    }

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        var changed = PropertyChanged;
        if (changed == null)
            return;

        changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

视图模型.cs

public class ViewModel
{

   public IList<DictionaryModel> DictionaryModels { get; private set; }

   public ViewModel()
   {
      DictionaryModels = new List<DictionaryModel>();

      // set demo data 
      DictionaryModels.Add(new DictionaryModel
      {
           Key = "Baboon",
           Value= 1,
      });

      DictionaryModels.Add(new DictionaryModel
      {
           Key = "Capuchin",
           Value= 2,
      });

   }

}

然后在 ContenPage.cs 中,绑定 ViewModel:

BindingContext = new ViewModel();

最后在 Xaml 中:

<ListView x:Name="ItemsListView" VerticalOptions="FillAndExpand" SeparatorVisibility="None" HasUnevenRows="true" ItemsSource="{Binding DictionaryModels}">
  <ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell>
        <Grid>
          <Label Text="{Binding Key}" Grid.Row="1" Grid.Column="0" Style="{DynamicResource lblTitle}" />
          <Entry x:Name="test" Text="{Binding Value}" Grid.Row="1" Grid.Column="1" />
        </Grid>

      </ViewCell>

    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>