[英]WPF DataGrid display 'NULL' when bound property is null
当对应的源值为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)
};
}
}
我想知道是否有一种方法可以将Converter与所有datagrid列相关联,或者是否有其他可行的解决方案。
提前致谢
我想知道是否有一种方法可以将Converter与所有datagrid列相关联,或者是否有其他可行的解决方案。
“可行的解决方案”将是处理视图中的AutoGeneratingColumn
事件。 或在同一视图的XAML标记中显式定义所有列。
两种方法都不会破坏MVVM模式,因为这是与视图相关的功能,而MVVM 并不是要从视图中消除与视图相关的代码。 它主要是关于关注点的分离和以编程方式执行与视图相关的事情,而不是在XAML标记中完美地做到这一点。
我会尝试在ViewModel
做到这一点。 可以说您的ViewModel
类看起来像这样(为简单起见,我将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
,该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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.