【问题标题】:DataGrid Column Binding with DictionaryDataGrid 列与字典绑定
【发布时间】:2016-07-19 22:24:26
【问题描述】:

我需要帮助将字典绑定到 wpf DataGrid 列:

什么有效?

以 int 为键的字典 (Dictionary<int, Object>) 适用于以下绑定路径

dgtc1.Binding = new Binding("ResourceDic1[0].Name");

什么不起作用?

以 int 为键的字典 (Dictionary<String, Object>) 无法使用以下绑定路径,我需要帮助才能使此绑定正常工作:

dgtc1.Binding = new Binding("ResourceDic1["Name_100"].Name");

这里是重现问题的代码:

XAML:

<Window x:Class="DataGridBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Loaded="Window_Loaded">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="3"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <DataGrid Grid.Row="0" Name="DataGrid1" AutoGenerateColumns="False"/>
        <GridSplitter Grid.Row="1" Height="3" Background="Black" HorizontalAlignment="Stretch" VerticalAlignment="Top"/>
        <DataGrid Grid.Row="2" Name="DataGrid2" AutoGenerateColumns="False"/>
    </Grid>
</Window>

代码 MainWindow.xaml.cs:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;

namespace DataGridBinding
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            List<Project> Projects = new List<Project>();

            for (int i = 0; i < 5; i++)
            {
                Project pj = new Project();
                for(int k = 0; k < 5; k++)
                {
                    pj.ResourceDic1.Add(k, new PResource(String.Format("Name_{0}", 100 + k), 100 + k, 0.25));
                    pj.ResourceDic2.Add(String.Format("Name_{0}", 100 + k), new PResource(String.Format("Name_{0}", 100 + k), 100 + k, 0.25));
                }
                Projects.Add(pj);
            }

            DataGrid1.ItemsSource = Projects;
            DataGridTextColumn dgtc1 = new DataGridTextColumn();
            dgtc1.Header = "Binding1";
            //////////////////////
            //This binding works//
            //////////////////////
            dgtc1.Binding = new Binding("ResourceDic1[0].Name");
            DataGrid1.Columns.Add(dgtc1);
            DataGrid1.Items.Refresh();

            DataGrid2.ItemsSource = Projects;
            DataGridTextColumn dgtc2 = new DataGridTextColumn();
            dgtc2.Header = "Binding2";
            /////////////////////////////
            //This binding doesn't work//
            /////////////////////////////
            dgtc2.Binding = new Binding(@"ResourceDic2[""Name_100""].Name");
            DataGrid2.Columns.Add(dgtc2);
            DataGrid2.Items.Refresh();
        } 
    }
}

代码项目.cs:

using System;
using System.Collections.Generic;

namespace DataGridBinding
{
    public class Project
    {
        public Dictionary<int, PResource> ResourceDic1 { get; set; }
        public Dictionary<String, PResource> ResourceDic2 { get; set; }

        public Project()
        {
            ResourceDic1 = new Dictionary<int, PResource>();
            ResourceDic2 = new Dictionary<string, PResource>();
        }
    }
}

代码 PResource.cs:

using System;

namespace DataGridBinding
{
    public class PResource
    {
        public String Name { get; set; }
        public int Number { get; set; }
        public double Value { get; set; }

        public PResource(String Name, int Number, double Value)
        {
            this.Name = Name;
            this.Number = Number;
            this.Value = Value;
        }
    }
}

我需要如何构造绑定路径以使其正常工作?

dgtc2.Binding = new Binding(@"ResourceDic2[""Name_100""].Name");

【问题讨论】:

  • 你刚刚试过dgtc2.Binding = new Binding(@"ResourceDic2[Name_100].Name");吗?
  • @Sam,确实有效!

标签: c# wpf wpfdatagrid


【解决方案1】:

根据我的评论:试试dgtc2.Binding = new Binding(@"ResourceDic2[Name_100].Name");

【讨论】:

    【解决方案2】:
    for(int k = 0; k < 5; k++)
    {
        pj.ResourceDic1.Add(k, new PResource(String.Format("Name_{0}", 100 + k), 100 + k, 0.25));
        pj.ResourceDic2.Add(String.Format("Name_{0}", 100 + k), new PResource(String.Format("Name_{0}", 100 + k), 100 + k, 0.25));
    }
    

    您正在添加:

    • [0]:PResource 对象 ||| “Name_100”:PResource 对象
    • [1]:PResource 对象 ||| “Name_101”:PResource 对象
    • [2]:PResource 对象 ||| “Name_102”:PResource 对象
    • [3]:PResource 对象 ||| “Name_103”:PResource 对象
    • [4]:PResource 对象 ||| “Name_104”:PResource 对象

    Name_1 密钥在ResourceDic2 中不存在。

    【讨论】:

    • 感谢您指出错误,即使修复后也无法正常工作,我已根据您的回答更新了问题。
    • @Abbas 我还想指出您没有为DataGrid2 设置ItemsSource
    • @Abbas 而" 的转义字符是\ ,这意味着你应该使用\"
    • 感谢您再次指出错误,很抱歉没有早点注意到,不幸的是修复它们仍然不起作用。而" 的“vertabtim 字符串文字”转义字符中的 w.r.t 转义字符是另一个",您可以在stackoverflow.com/q/556133/1437877 中找到更多详细信息
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多