C# WPF DataGrid 将行背景绑定到 DataRow 中找到的 属性
C# WPF DataGrid Bind Row background to Property found in DataRow
我需要将 DataRow 的背景绑定到附加到 DataRow 的对象的 属性。我所做的是:
我扩展了 DataRow class,使其具有类型为 [object] 的 'Tag' 属性。
示例:
myDataTable.Rows.Cast<ExtendedDataRow>().ToList(){r => {
r.Tag = Brushes.Green;
});
所以基本上每一行都有一个标签 属性,它是一个刷子,绿色。我需要将我的 DataTable 绑定到这个数据集,并将每一行绑定到标签 属性.
我尝试过的:
<DataGrid ItemsSource="{Binding myDataTable}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="{Binding Tag.Background}" />
</Style>
</DataGrid.RowStyle>
</DataGrid>
但是当我尝试绑定到 Tag 项目时,它似乎没有 'pick up'。我需要为此创建一个 ItemTemplate 吗? (我试过了,也没用)
注意:数据集绑定成功,在 ViewModel 的代码中我可以看到每一行的标签项都已填充。
提前致谢
编辑:已请求查看我的 ExtendedDataRow class 是如何使用的:
public class ExtendedDataTable : DataTable {
public ExtendedDataTable()
: base() {
}
public ExtendedDataTable(string tableName)
: base(tableName) {
}
public ExtendedDataTable(string tableName, string tableNamespace)
: base(tableName, tableNamespace) {
}
// Return the RowType as ExtendedDataRow instead of DataRow
protected override Type GetRowType() {
return typeof(ExtendedDataRow);
}
// Use the RowBuilder to return an ExtendedDataRow instead of DataRow
protected override DataRow NewRowFromBuilder(DataRowBuilder builder) {
return new ExtendedDataRow(builder);
}
}
public class ExtendedDataRow : DataRow {
public ExtendedDataRow()
: base(null) {
}
public ExtendedDataRow(DataRowBuilder rb)
: base(rb) {
}
// The tag object attached to the ExtendedDataRow
public object Tag { get; set; }
}
编辑 2:
要绑定到 ExtendedDataTable 而不是普通 DataTable,您必须填充普通 DataTable,并使用其 IDataReader 填充 ExtendedDataTable 的数据集:
myDt = new ExtendedDataTable();
dt = new DataTable();
var dt = GetDataTable("SELECT * FROM SomeTable");
var reader = dt.DataSet.CreateDataReader(dt);
myDt.Load(reader);
我做的每件事都符合预期,就像你所做的一样。
我通过查看输出发现了这个问题 window :
System.Windows.Data Error: 40 : BindingExpression path error: 'Tag' property not found on 'object' ''DataRowView' (HashCode=30296746)'. BindingExpression:Path=Tag; DataItem='DataRowView' (HashCode=30296746); target element is 'DataGridRow' (Name=''); target property is 'Background' (type 'Brush')
DataRow 是如何在内部包裹 DataRowView
XAML :
<DataGrid CanUserAddRows="False" ItemsSource="{Binding Table}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="{Binding Row.Tag, Mode=OneWay}" />
</Style>
</DataGrid.RowStyle>
</DataGrid>
我需要将 DataRow 的背景绑定到附加到 DataRow 的对象的 属性。我所做的是:
示例:
myDataTable.Rows.Cast<ExtendedDataRow>().ToList(){r => {
r.Tag = Brushes.Green;
});
所以基本上每一行都有一个标签 属性,它是一个刷子,绿色。我需要将我的 DataTable 绑定到这个数据集,并将每一行绑定到标签 属性.
我尝试过的:
<DataGrid ItemsSource="{Binding myDataTable}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="{Binding Tag.Background}" />
</Style>
</DataGrid.RowStyle>
</DataGrid>
但是当我尝试绑定到 Tag 项目时,它似乎没有 'pick up'。我需要为此创建一个 ItemTemplate 吗? (我试过了,也没用)
注意:数据集绑定成功,在 ViewModel 的代码中我可以看到每一行的标签项都已填充。
提前致谢
编辑:已请求查看我的 ExtendedDataRow class 是如何使用的:
public class ExtendedDataTable : DataTable {
public ExtendedDataTable()
: base() {
}
public ExtendedDataTable(string tableName)
: base(tableName) {
}
public ExtendedDataTable(string tableName, string tableNamespace)
: base(tableName, tableNamespace) {
}
// Return the RowType as ExtendedDataRow instead of DataRow
protected override Type GetRowType() {
return typeof(ExtendedDataRow);
}
// Use the RowBuilder to return an ExtendedDataRow instead of DataRow
protected override DataRow NewRowFromBuilder(DataRowBuilder builder) {
return new ExtendedDataRow(builder);
}
}
public class ExtendedDataRow : DataRow {
public ExtendedDataRow()
: base(null) {
}
public ExtendedDataRow(DataRowBuilder rb)
: base(rb) {
}
// The tag object attached to the ExtendedDataRow
public object Tag { get; set; }
}
编辑 2: 要绑定到 ExtendedDataTable 而不是普通 DataTable,您必须填充普通 DataTable,并使用其 IDataReader 填充 ExtendedDataTable 的数据集:
myDt = new ExtendedDataTable();
dt = new DataTable();
var dt = GetDataTable("SELECT * FROM SomeTable");
var reader = dt.DataSet.CreateDataReader(dt);
myDt.Load(reader);
我做的每件事都符合预期,就像你所做的一样。
我通过查看输出发现了这个问题 window :
System.Windows.Data Error: 40 : BindingExpression path error: 'Tag' property not found on 'object' ''DataRowView' (HashCode=30296746)'. BindingExpression:Path=Tag; DataItem='DataRowView' (HashCode=30296746); target element is 'DataGridRow' (Name=''); target property is 'Background' (type 'Brush')
DataRow 是如何在内部包裹 DataRowView
XAML :
<DataGrid CanUserAddRows="False" ItemsSource="{Binding Table}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="{Binding Row.Tag, Mode=OneWay}" />
</Style>
</DataGrid.RowStyle>
</DataGrid>