Dot-Net

如何在程式碼隱藏中動態添加轉換器

  • April 20, 2012

我正在通過 IDictionary 將 Datagrid 綁定到動態數據:http ://www.scottlogic.co.uk/blog/colin/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment -page-1/#comment-8681

但我不想在 xaml 中定義任何列(以下是 Colin Eberhardt 的文章中的操作方式

<data:DataGrid.Columns>
   <data:DataGridTextColumn Header="Forename" Binding="{Binding Converter={StaticResource RowIndexConverter}, ConverterParameter=Forename}" />
</data:DataGrid.Columns>

所以我寫了下面的程式碼來嘗試在後面的程式碼中做同樣的事情,但是程式碼並沒有呼叫RowIndexConverter。一定是缺少了什麼。

程式碼:

// add columns

DataGridTextColumn textColumn = new DataGridTextColumn();
textColumn.Header = "Forename";

Binding bind = new Binding("Forename");
bind.Converter = new RowIndexConverter() ;
bind.ConverterParameter = "Forename";            

textColumn.Binding = bind;
_dataGrid.Columns.Add(textColumn);

其餘程式碼(此處為上下文):

// generate some dummy data
Random rand = new Random();
for (int i = 0; i < 200; i++)
{
   Row row = new Row();
   row["Forename"] = s_names[rand.Next(s_names.Length)];
   row["Surname"] = s_surnames[rand.Next(s_surnames.Length)];
   row["Age"] = rand.Next(40) + 10;
   row["Shoesize"] = rand.Next(10) + 5;

   _rows.Add(row);
}

// bind to our DataGrid
_dataGrid.ItemsSource = _rows;    

public class Row
{
   private Dictionary<string, object> _data = new Dictionary<string, object>();

   public object this[string index]
   {
       get
       {
           return _data[index];
       }
       set
       {
           _data[index] = value;
       }
   }
}

通過屬性路徑獲取數據後呼叫轉換器。由於 Row 中沒有“Forename”屬性,因此它不起作用(您可以在輸出視窗中看到綁定異常)。

我通過將綁定定義更改為:

   Binding bind = new Binding();
   bind.Mode = BindingMode.OneWay;

因為沒有路徑就不能進行雙向綁定(沒有第二行我得到的例外)。再想一想,沒有屬性路徑是有道理的,因為我們想綁定到完整的 Row 對象,而不是它的屬性之一。

注意:使用 VS 2008 SP1、WPF 項目進行測試。

引用自:https://stackoverflow.com/questions/2314165