Ema*_*mad 6 data-binding wpf datagrid datatemplateselector
这让我疯了.我在代码中创建一个DataGrid,然后将其绑定到数据表.这是动态的,每次创建网格时行和列都会不同.
基本上我遍历我的数据表并为每列创建DataGrid列,如下所示:
private static void CreateDataGridColumns(DataGrid datagrid, Document doc)
{
if (doc == null) return; //return
datagrid.Columns.Clear();
foreach (var item in doc.Keys)
{
var column = new DataGridTemplateColumn
{
Header = item,
CellTemplateSelector = new CustomRowDataTemplateSelector(),
};
datagrid.Columns.Add(column);
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在使用自定义数据模板选择器,因此我可以根据其内容以不同方式呈现单元格.
这是模板选择器
public class CustomRowDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
var presenter = container as ContentPresenter;
var gridCell = presenter.Parent as DataGridCell;
if (element != null && item != null && gridCell != null)
{
var row = item as DataRow;
if (row != null)
{
var cellObject = row[gridCell.Column.DisplayIndex];
//set template based on cell type
if (cellObject is DateTime)
{
return element.FindResource("dateCell") as DataTemplate;
}
return element.FindResource("stringCell") as DataTemplate;
}
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的stringCell DataTemplate
<DataTemplate x:Key="stringCell">
<StackPanel>
<TextBlock Style="{StaticResource cellStyle}"
Grid.Row="0" Grid.Column="0"
Text="{Binding Converter={StaticResource cellConverter}}" />
</StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
问题是为每个单元格调用模板选择器(如预期的那样),但我不知道它是哪个单元格,所以我不知道如何在TextBlock上设置Text.我很乐意做这样的事情
<DataTemplate x:Key="stringCell">
<StackPanel>
<TextBlock Style="{StaticResource cellStyle}"
Grid.Row="0" Grid.Column="0"
Text="{Binding Path=Row[CellIndex], Converter={StaticResource cellConverter}}" />
</StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
但是我没有什么可以获得CellIndex.我怎样才能做类似这样的事情,我可以设置Path = Row [CellIndex]
pap*_*zzo -1
不确定您想在功能上实现什么目标。您可能会通过代码来完成此操作。创建一个更高级别的类 CellClass,它具有 DisplayValue 属性。实现日期和字符串。使用 Path=DisplayValue 将源绑定到 CellClass。您甚至可以创建 List CellClasses 并绑定到 CellClass[0]、CellClass[1] ...我知道这可以正常工作,但我不确定它是否提供您正在寻找的功能。
public abstract class CellClass
{
public abstract String DispValue { get; }
}
public class CellClassDate : CellClass
{
public override String DispValue { get ...; }
public DateTime DateValue { get .. set ... }
}
public class CellClassString : CellClass
{
public override String DispValue { get ...; }
public DateTime StringValue { get .. set ... }
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1602 次 |
最近记录: |