WPF 后台创建列如何设置Converter

本文介绍了如何在WindowsPresentationFoundation(WPF)的DataGrid中创建新列,并使用自定义值转换器进行数据绑定。展示了如何在前台代码中配置列的Header、绑定数据以及在后台定义MyConverter类进行数据转换。

前台代码:创建新列并绑定内容

<Window x:Class="MethodConfiguration.ShowTable"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MethodConfiguration;assembly="
        Title="ShowTable" Height="372" Width="892" Loaded="Window_Loaded">
    <Window.Resources>
    <local:MyConverter x:Key="myConverter"/>
</Window.Resources>
    <Grid x:Name="gridMain">
        <DataGrid Grid.Row="1" RowHeaderWidth="50" Width="1100" CanUserSortColumns="False" x:Name="dataGrid1" MouseDoubleClick="dataGrid1_MouseDoubleClick" SelectionChanged="dataGrid1_SelectionChanged"  AutoGenerateColumns="False" CanUserAddRows="False" IsReadOnly="True" Grid.RowSpan="2" Grid.ColumnSpan="5">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding hmd ,Converter={StaticResource myConverter}}" Header="黑名单" Width="70"/>
        <DataGridTextColumn Binding="{Binding CreateUserName}" Header="添加人" Width="100"/>
        <DataGridTextColumn Binding="{Binding CreateTime,StringFormat='yyyy-MM-dd HH:mm:ss'}" Header="添加时间" Width="180"/>
    </DataGrid.Columns>
</DataGrid>
    </Grid>
</Window>

首先引入转换器类的命名空间,由于我们实在项目的命名空间下wpfbase定义的类,不需要再引入命名空间。在页面的资源中添加转换器资源,<local:MyConverter x:Key="myConverter"/>,MyConverter是后台文件中定义的类名,myConverter是现在定义的转换器资源名称,在后面使用,这里注意,添加这行代码时编译器可能会提醒"命名空间中找不到此名称",不用在意这个,继续往下做。在黑名单那一列的绑定数据中,Binding="{Binding hmd ,Converter={StaticResource myConverter}}"使用转换器资源实现数据内容的转换。效果如下:

后台代码:

 public class MyConverter : IValueConverter
 {
     /// <summary>
     /// 源到目标
     /// </summary>
     /// <param name="value"></param>
     /// <param name="targetType"></param>
     /// <param name="parameter"></param>
     /// <param name="culture"></param>
     /// <returns></returns>
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
     {
         bool boolValue = false;
         if (value != null)
             boolValue = (bool)value;
         return boolValue ? "是" : "否";
     }
     /// <summary>
     /// 目标到源
     /// </summary>
     /// <param name="value"></param>
     /// <param name="targetType"></param>
     /// <param name="parameter"></param>
     /// <param name="culture"></param>
     /// <returns></returns>
     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
     {
         throw new NotImplementedException();
     }
 }

在后台我们创建了一个继承至IValueConverter的MyConverter类,在这个类中我们必须覆盖两个接口函数,Convert和ConvertBack。Convert函数实现了从数据源到呈现目标的数据转换,其中true对应的是"是",false对应的是"否";ConvertBack函数实现了从呈现目标到数据源的转换,"是"对应的是true,"否"对应的是false。

<think>我们参考了用户提供的引用内容,特别是引用[1]、[3]、[4]中关于动态创建DataGrid的信息。 用户需求:在WPF中动态创建DataGrid(实际应为动态创建,因为DataGrid本身是静态控件,动态的是其) 实现步骤: 1. 创建DataGrid控件(可以在XAML中定义,也可以在代码中动态创建整个DataGrid) 2. 动态生成(根据需求创建不同类型的,如DataGridTextColumn, DataGridTemplateColumn等) 3. 将添加到DataGrid的Columns集合中 4. 绑定数据源 根据引用[1],用户希望动态添加(例如规则一、规则二,然后按一次键添加一)。 根据引用[4],展示了如何动态创建DataGridTemplateColumn(用于显示图片)。 根据引用[3],有关于后台动态生成DataGrid的内容。 因此,我们可以给出以下示例: 方案一:在已有DataGrid控件上动态添加(假设DataGrid已经在XAML中定义,名称为dataGrid) 方案二:完全在代码中动态创建DataGrid并添加 这里我们给出方案一的示例,因为更常见(DataGrid在XAML中定义,然后动态添加)。 </think>在WPF中动态创建DataGrid的实现方法主要涉及的动态生成和绑定,以下是详细步骤和代码示例: ### 1. **基础实现(动态添加)** ```csharp // 创建DataGrid控件 DataGrid dynamicGrid = new DataGrid(); dynamicGrid.AutoGenerateColumns = false; // 必须禁用自动生成 // 动态创建文本 DataGridTextColumn textColumn = new DataGridTextColumn(); textColumn.Header = "规则一"; textColumn.Binding = new Binding("Rule1"); // 绑定数据对象属性 dynamicGrid.Columns.Add(textColumn); // 添加新(示例:按钮点击事件) private void AddColumn_Click(object sender, RoutedEventArgs e) { DataGridTextColumn newColumn = new DataGridTextColumn(); newColumn.Header = $"规则{动态Grid.Columns.Count + 1}"; newColumn.Binding = new Binding($"Rule{动态Grid.Columns.Count + 1}"); dynamicGrid.Columns.Add(newColumn); } ``` ### 2. **复杂类型(模板)** 根据引用[4]创建图片: ```csharp var imgColumn = new DataGridTemplateColumn(); imgColumn.Header = "状态"; // 创建图片模板 var factory = new FrameworkElementFactory(typeof(Image)); var binding = new Binding("Status") { Converter = new StatusToImageConverter() // 自定义转换器 }; factory.SetBinding(Image.SourceProperty, binding); // 应用模板 imgColumn.CellTemplate = new DataTemplate() { VisualTree = factory }; dynamicGrid.Columns.Add(imgColumn); ``` ### 3. **数据绑定与样式** ```csharp // 数据源绑定(引用[2]) dynamicGrid.ItemsSource = new ObservableCollection<RuleItem>(); // 行样式设置(引用[5]) dynamicGrid.RowStyle = new Style(typeof(DataGridRow)) { Triggers = { new Trigger() { Property = DataGridRow.AlternationIndexProperty, Value = 0, Setters = { new Setter(BackgroundProperty, Brushes.LightYellow) } } } }; ``` ### 4. **完整示例流程** ```csharp // 主窗口初始化 public MainWindow() { InitializeComponent(); var grid = new DataGrid(); grid.Name = "动态Grid"; this.Content = grid; // 添加到界面 // 初始 AddBaseColumns(grid); } private void AddBaseColumns(DataGrid grid) { grid.Columns.Add(new DataGridTextColumn { Header = "ID", Binding = new Binding("Id") }); } ``` ### 关键注意事项: 1. **绑定机制** 需通过`Binding`关联数据对象的属性,属性名需与`Binding.Path`一致[^2] 2. **实时更新** 使用`ObservableCollection`作为数据源可实现/数据变更的自动刷新[^2] 3. **性能优化** - 批量操作时暂停渲染:`grid.BeginInit()`/`grid.EndInit()` - 虚拟化技术:`EnableRowVirtualization="True"` 4. **自定义模板** 复杂(如图片、按钮)需使用`DataGridTemplateColumn`构建视觉树[^4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值