2016-07-19 4 views
0

Мне нужна помощь в связывании словарь в WPF DataGrid Колонка:DataGrid колонке Связывание с Словаре

Что работает?

Словарь с междунар как ключевой (Dictionary<int, Object>) работает со следующими связывающим пути

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

Что не работает?

Словаря с междунар как ключ (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(); 
     } 
    } 
} 

Кодекса Project.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"); 
+0

Вы только попробуйте 'dgtc2.Binding = новый Binding (@ "ResourceDic2 [Name_100] .Name");'? – Sam

+0

@ Да, это сработало! – Abbas

ответ

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.

+0

Спасибо за указание на ошибку, даже после ее исправления, она не работает, и я обновил вопрос, основываясь на вашем ответе. – Abbas

+0

@Abbas Я также хотел бы указать, что вы не установили 'ItemsSource' для' DataGrid2'. – Jai

+0

@Abbas И escape-символ для '' 'is' \ ', что означает, что вы должны использовать' \ ''. – Jai

 Смежные вопросы

  • Нет связанных вопросов^_^