2017-11-18 108 views
0

我想在我的空闲时间学习一些WPF,我已经得到了一个应用程序运行,但其中一个已经躲过了我一段时间的事情是如何根据数据列的行值为他们将共享的列设置一个可以出现在页面上的多个数据网格的样式。页面共享DataTrigger风格转换器不能找到StaticResource

我的意图是,我可以根据货币金额是正数还是负数来设置整行的文本颜色(Foreground属性)的样式。

我到目前为止所能得到的结果适用于单对硬编码值,我遇到的问题是连接到一个Converter,它将执行我想要的比较以返回True/False ...

这是我到目前为止有:

<DataGrid AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Width="*" Binding="{Binding Date}" Header="Date"/> 
     <DataGridTextColumn Width="*" Binding="{Binding Category}" Header="Category"/> 
     <DataGridTextColumn Width="*" Binding="{Binding Amount}" Header="Amount"/> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

具体Page我试图建立都会有这样的同类型电网3个不同时间的,与数据的不同排列。网格本身都按需要工作。

数据网格填充了这个类的集合:

public class TransactionDto 
{ 
    public long Id { get; set; } 
    public decimal Amount { get; set; } 
    public string Category { get; set; } 
    public DateTime Date { get; set; } 
} 

我已经设置了该转换器如下:

public class AmountConverter : IValueConverter 
{ 
    private const decimal Threshold = 0.00m; 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (decimal)value >= Threshold; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

不过,我似乎无法得到的结合datagrid的列和这个转换器想通了。这是我迄今为止所尝试的,基于对其他SO问题和其他地方发布的答案进行实验,但这些情况并非完全相同,并且试图将其应用于我的情况尚未奏效 - 我收到了一个异常到转换器结合在这里:

<Page.Resources> 
<Style TargetType="DataGridRow"> 
    <Style.Triggers > 
     <DataTrigger Binding="{Binding Amount, RelativeSource={RelativeSource Self}, Converter={StaticResource ResourceKey=AmountConverter}}" Value="False"> 
      <Setter Property="Foreground" Value="Red"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Amount}" Value="-24.71"> 
      <Setter Property="Foreground" Value="Green"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style>   

使用的-24.71的硬编码值正常工作,就像用一个类似正值触发。

代码隐藏的C#文件包含所需的转换器类型的属性:

public AmountConverter AmountConverter { get; set; } = new AmountConverter();

当前异常,我得到的是以下几点:

System.Windows.Markup.XamlParseException

Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.

我真的不明白这个例外,我没有退出确定如何进行或者它告诉我的是问题。

理想情况下,我会在App.xaml中设置这个样式,并从与其相关的数据网格中引用它。

+0

格式化WPF datagrod –

回答

0

我通过this article找到了答案。我所做的更改是将以下内容添加到我的应用程序中。XAML文件,然后应用在整个应用程序进行必要的更改到所有相关的数据网格的:

<Application.Resources> 
    <local:AmountConverter x:Key="AmountConverter"/> 
    <Style TargetType="DataGridRow"> 
    <Style.Triggers > 
     <DataTrigger Binding="{Binding Amount, Converter={StaticResource AmountConverter}}" Value="False"> 
      <Setter Property="Foreground" Value="Red"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Amount, Converter={StaticResource AmountConverter}}" Value="True"> 
      <Setter Property="Foreground" Value="Green"/> 
     </DataTrigger> 
    </Style.Triggers> 
    </Style> 
</Application.Resources> 
0

在我看来,你的做法是有点用2个触发器,使绿色或阅读复杂。你的转换器可以返回颜色,你不需要触发器。

class AmountConverter: IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
    if (value is int) { 
     int quantity = (int)value; 
     if (quantity>=100) return Brushes.White; 
     if (quantity>=10) return Brushes.WhiteSmoke; 
     if (quantity>=0) return Brushes.LightGray; 
     return Brushes.White; //quantity should not be below 0 
    } 
    //value is not an integer. Do not throw an exception 
    // in the converter, but return something that is obviously wrong 
    return Brushes.Yellow; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
    throw new NotImplementedException(); 
    } 
} 

格式化WPF数据网格是非常困难的,Microsoft文档不会告诉您如何去做。为了更好地理解数据网格的不同部分如何可以很容易地进行格式化,请阅读我的文章CodeProject: Guide to WPF DataGrid formatting using bindings