我在WPF数据绑定的学习曲线上苦苦挣扎,可以使用一个例子。那些回答问题并链接到帮助他们“获得”WPF数据绑定的文章的奖励积分。
我正在尝试将自定义Table对象与WPF DataGrid绑定。
这是我的对象(我没有能力更改它们,签名被截断了一点):
public class MyTable
{
public int ColumnCount { get; }
public string GetColumnName(int columnIndex);
public IEnumerable<MyTableRow> GetRows();
}
public class MyTableRow
{
public MyTableCell [] Cells { get; }
}
public class MyTableCell
{
public string Value { get; }
}
因此,当前DataContext
上的Window
是MyTable
的实例。我看不到任何明确的方法从我的MyTable
对象自动生成列,所以我在代码中生成了它们:
private void dg_Table_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
MyTable tbl = e.NewValue as MyTable;
if (tbl != null)
{
//setup data grid columns
dg_Table.Columns.Clear();
for (int i = 0; i < tbl.ColumnCount; i++)
{
var column = new DataGridTextColumn()
{
Header = tbl.GetColumnName(i),
Binding = new Binding(string.Format("Cells[{0}]", i))
};
dg_Table.Columns.Add(column);
}
//end setup data grid columns
}
}
我认为下一步是将ItemsSource
的{{1}}属性绑定到DataGrid
对象上的GetRows
方法,但我不知道如何去做。我想也许可以使用MyTable
资源来完成,但我无法弄清楚如何在DataContext对象上引用方法。
有人可以帮我解决这个问题的XAML和代码吗?
答案 0 :(得分:3)
AFAIK您无法绑定到特定实例的方法。您可以绑定到属性,或在XAML中创建的实例的方法,或静态方法,但不能绑定给定实例的方法。
这是一些帮助我的绑定链接。
编辑:我意识到我应该尝试解决你当前的问题。 :P
首先,我对WPF中的DataGrid控件没有多少经验。话虽如此,当你绑定ItemsSource时它不会自动生成列吗?
我处理你的问题的方法是在MyTable对象周围创建一个包装器,并在包装器中实现一个调用GetRows方法的属性。将DataContext设置为包装器并将ItemsSource绑定到属性。
答案 1 :(得分:2)
使用值转换器索引Cells数组非常容易。转换器的参数是索引:
...
var column = new DataGridTextColumn()
{
Header = tbl.GetColumnName(i),
Binding = new Binding
{
Converter = CellAccessConverter.Instance,
Parameter = i
}
}
...
这是转换器本身:
private class CellAccessConverter : IValueConverter
{
public static readonly Instance = new CellAccessConverter();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((MyTableRow)value).Cells[(int)parameter];
}
object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
享受!