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

时间:2017-07-13 12:08:15

标签: c# wpf mvvm datagrid ivalueconverter

当相应的源值为null时,我正在尝试显示包含“NULL”字符串而不是空白单元格的单元格。我正在使用绑定到DataGridDataTable的{​​{1}}。

以前我设法通过AutoGeneratedColumns事件在代码隐藏中完成,但现在我已经切换到MVVM设计,我想避免这种情况。

AutoGenerateColumns="True"

我想知道是否有办法将Converter与所有datagrid列相关联,或者是否有任何其他可行的解决方案。

提前致谢

3 个答案:

答案 0 :(得分:3)

  

我想知道是否有办法将转换器与所有数据网格列或其他任何可行的解决方案相关联。

"可行的解决方案"将在视图中处理AutoGeneratingColumn事件。或者在同一视图的XAML标记中显式定义所有列。

这两种方法都没有打破MVVM模式,因为这是与视图相关的功能,而MVVM 关于从视图中消除与视图相关的代码。它主要是关注问题的分离和以编程方式执行视图相关的事情,而不是在XAML标记中执行它完全没问题。

答案 1 :(得分:0)

我会尝试在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;
       }
    }
}

答案 2 :(得分:0)

您还可以尝试Custom Markup Extension,以便在Converter内加入Binding。为了实现这一点,您还必须为不同类型的数据创建DataTemplates,但总体收益(即处理数据类型)将超过编码量。以下是来自{{3}}

的所述标记扩展的示例
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>