繁体   English   中英

绑定属性为null时,WPF DataGrid显示“ NULL”

[英]WPF DataGrid display 'NULL' when bound property is null

当对应的源值为null时,我试图显示包含'NULL'字符串而不是空白单元格的单元格。 我正在使用绑定到DataTableAutoGenerateColumns="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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM