2010-02-22 30 views
9

Tôi Ràng buộc một DataGrid để dữ liệu động qua IDictionary: http://www.scottlogic.co.uk/blog/colin/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment-page-1/#comment-8681Làm thế nào để tự động thêm một chuyển đổi trong code-behind

Nhưng tôi không muốn xác định bất kỳ cột trong XAML (dưới đây là cách nó được thực hiện trong Colin bài Eberhardt của

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

Vì vậy, tôi đã viết đoạn mã sau để thử và làm điều tương tự trong mã phía sau, nhưng mã không gọi RowIndexConverter Something phải thiếu

mã số:..

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

Phần còn lại của mã (vào đây để ngữ cảnh):

// 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; 
     } 
    } 
} 

Trả lời

8

Bộ chuyển đổi được gọi là sau khi nhận được các dữ liệu thông qua con đường bất động sản. Vì không có thuộc tính "Forename" trong Row, nó không hoạt động (bạn có thể thấy ngoại lệ Binding trong cửa sổ Output).

Tôi giải quyết nó bằng cách thay đổi định nghĩa Binding để:

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

như bạn không thể có hai cách ràng buộc mà không có một đường dẫn (ngoại trừ tôi mà không có dòng thứ hai). Không có đường dẫn đặc tính nào có ý nghĩa, theo ý nghĩ thứ hai, vì chúng ta muốn liên kết với đối tượng Row đầy đủ, chứ không phải một thuộc tính của nó.

Lưu ý: thử nghiệm với dự án VS 2008 SP1, WPF.

+0

Ahh, công việc tuyệt vời, cảm ơn. –

Các vấn đề liên quan