当绑定 属性 为空时,WPF DataGrid 显示 'NULL'
WPF DataGrid display 'NULL' when bound property is null
当相应的源值为空时,我试图显示包含 'NULL' 字符串的单元格而不是空白单元格。我正在使用绑定到 DataTable
和 AutoGenerateColumns="True"
的 DataGrid
。
以前我设法通过 AutoGeneratedColumns 事件在代码隐藏中完成它,但现在我已经切换到 MVVM 设计并且我想避免这种情况。
foreach (var column in dgwCustomTableSelected.Columns)
{
if (column is DataGridTextColumn)
{
((DataGridTextColumn)column).Binding =
new Binding() {
Converter = new NullValueConverter((string)column.Header)
};
}
}
我想知道是否有办法将转换器关联到所有数据网格列或任何其他可行的解决方案。
提前致谢
I was wondering whether there's a way to associate a Converter to all the datagrid columns or any other feasible solution to this.
"feasible solution" 将处理视图中的 AutoGeneratingColumn
事件。或者在同一视图的 XAML 标记中明确定义所有列。
这两种方法都没有破坏 MVVM 模式,因为这是与视图相关的功能,而 MVVM 不是关于从视图中消除与视图相关的代码。它主要是关于关注点分离和以编程方式做 与视图相关的 事情而不是在 XAML 标记中做它是非常好的。
我会尝试在 ViewModel
中完成。假设您的 ViewModel
class 看起来像这样(为简单起见,我将 INotofyPropertyChanged 排除在外):
public class ViewModel
{
private ModelClass model = new ModelClass();
public string Name
{
get
{
return model.Name;
}
set
{
model.name = value;
}
}
}
您可以将其重构为如下形式:
public class ViewModel
{
private ModelClass model = new ModelClass();
public string Name
{
get
{
if(model.Name == null)
{
return "NULL";
}
return model.Name;
}
set
{
model.name = value;
}
}
}
您也可以尝试 Custom Markup Extension
,这样您就可以在 Binding
中包含 Converter
。为此,您还必须为不同类型的数据创建 DataTemplates
,但总体收益(即处理数据类型)将超过编码量。这是来自 searchwindevelopment
的所述标记扩展的示例
class NumberToBrushConverter : MarkupExtension, IValueConverter
{
private static NumberToBrushConverter _converter = null;
public override object ProvideValue(IServiceProvider serviceProvider)
{
// determine if we have an instance of converter
// return converter to client
return _converter ?? (_converter = new NumberToBrushConverter());
}
public object Convert(object value, Type targetType,
object parameter,CultureInfo culture)
{
return new SolidColorBrush(Colors.Orange);
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后在 xaml 你会像这样使用它:
<Window x:Class="ValueConverterTips.CustomMarkupTip"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters='clr-namespace:ValueConverterTips.Converters'
Title="CustomMarkupTip" >
<!-- no longer need the resources section -->
<Grid>
<Ellipse Fill='{Binding SomeIntData,
Converter={converters:NumberToBrushConverter}}'
Width='10' Height='10' />
</Grid>
</Window>
您必须修改它以适合您的情况。
编辑
这就是你如何将它与 AutoGenerateColumns=true
一起使用:
<Style TargetType="DataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Button Content="Ok"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<DataGrid AutGenerateColumns="true" ItemsSource={Binding xxx} etc...>
</DataGrid>
当相应的源值为空时,我试图显示包含 'NULL' 字符串的单元格而不是空白单元格。我正在使用绑定到 DataTable
和 AutoGenerateColumns="True"
的 DataGrid
。
以前我设法通过 AutoGeneratedColumns 事件在代码隐藏中完成它,但现在我已经切换到 MVVM 设计并且我想避免这种情况。
foreach (var column in dgwCustomTableSelected.Columns)
{
if (column is DataGridTextColumn)
{
((DataGridTextColumn)column).Binding =
new Binding() {
Converter = new NullValueConverter((string)column.Header)
};
}
}
我想知道是否有办法将转换器关联到所有数据网格列或任何其他可行的解决方案。
提前致谢
I was wondering whether there's a way to associate a Converter to all the datagrid columns or any other feasible solution to this.
"feasible solution" 将处理视图中的 AutoGeneratingColumn
事件。或者在同一视图的 XAML 标记中明确定义所有列。
这两种方法都没有破坏 MVVM 模式,因为这是与视图相关的功能,而 MVVM 不是关于从视图中消除与视图相关的代码。它主要是关于关注点分离和以编程方式做 与视图相关的 事情而不是在 XAML 标记中做它是非常好的。
我会尝试在 ViewModel
中完成。假设您的 ViewModel
class 看起来像这样(为简单起见,我将 INotofyPropertyChanged 排除在外):
public class ViewModel
{
private ModelClass model = new ModelClass();
public string Name
{
get
{
return model.Name;
}
set
{
model.name = value;
}
}
}
您可以将其重构为如下形式:
public class ViewModel
{
private ModelClass model = new ModelClass();
public string Name
{
get
{
if(model.Name == null)
{
return "NULL";
}
return model.Name;
}
set
{
model.name = value;
}
}
}
您也可以尝试 Custom Markup Extension
,这样您就可以在 Binding
中包含 Converter
。为此,您还必须为不同类型的数据创建 DataTemplates
,但总体收益(即处理数据类型)将超过编码量。这是来自 searchwindevelopment
class NumberToBrushConverter : MarkupExtension, IValueConverter
{
private static NumberToBrushConverter _converter = null;
public override object ProvideValue(IServiceProvider serviceProvider)
{
// determine if we have an instance of converter
// return converter to client
return _converter ?? (_converter = new NumberToBrushConverter());
}
public object Convert(object value, Type targetType,
object parameter,CultureInfo culture)
{
return new SolidColorBrush(Colors.Orange);
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后在 xaml 你会像这样使用它:
<Window x:Class="ValueConverterTips.CustomMarkupTip"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters='clr-namespace:ValueConverterTips.Converters'
Title="CustomMarkupTip" >
<!-- no longer need the resources section -->
<Grid>
<Ellipse Fill='{Binding SomeIntData,
Converter={converters:NumberToBrushConverter}}'
Width='10' Height='10' />
</Grid>
</Window>
您必须修改它以适合您的情况。
编辑
这就是你如何将它与 AutoGenerateColumns=true
一起使用:
<Style TargetType="DataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Button Content="Ok"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<DataGrid AutGenerateColumns="true" ItemsSource={Binding xxx} etc...>
</DataGrid>