【问题标题】:WPF using IValueConverter and referencing class in app.xamlWPF 在 app.xaml 中使用 IValueConverter 和引用类
【发布时间】:2014-04-30 17:51:14
【问题描述】:

我有一个包含数据网格的 WPF 应用程序。我正在尝试使用自定义值转换器来决定单元格的字体颜色。

我已经创建了下面的类。

namespace MyNameSpace
{    
    public class AboveMeanToBoolConverter : IValueConverter
    {
         public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
         {
            double dValue = System.Convert.ToDouble(value);
            double dParameter = System.Convert.ToDouble(parameter);

            return (dValue > dParameter);  
         }

         public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
         {
            return null;
         }
}

在我的 MainWindow xaml 中,我有以下内容

<Window.Resources>
    <local:AboveMeanToBoolConverter x:Key="meanToBool"/>
</Window.Resources>

第一期:

键入 local 后:智能感知显示我的类 AboveMeanToBoolConverter。但是,该行突出显示“命名空间 clr-namespace:MyNameSpace 中不存在名称 AboveMeanToBoolConverter”

第二期

我在 app.xaml 中拥有我的应用程序和数据网格的所有样式。

下面是我在设置 DataGridRow 样式的部分中的 app.xaml 中 xaml 的 sn-p。Binding 行突出显示并告诉我“资源“meanToBool”无法解析。”那么如何在我的 app.xaml 中引用我的转换器?此外,我的设置器指的是边框(从正在工作的东西复制和粘贴 - 如何更改它以使字体改变颜色而不是单元格的背景?

 <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding MeanPost, Converter={StaticResource meanToBool}, ConverterParameter=0}" Value="0">
                            <Setter TargetName="DGR_Border" Property="Background" Value="{StaticResource brushRowSend}"/>
                        </DataTrigger>
                    </ControlTemplate.Triggers>

更新

回答下面的评论。下面是我本地定义的地方。

在我的 MainWindow.xaml 中

<Window x:Class="MyNameSpace.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local="clr-namespace:MyNameSpace"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     
    WindowStartupLocation="CenterScreen"
    MinHeight="800" MinWidth="1000"
    Height="800" Width="1200" 
    Background="LightSteelBlue" HorizontalAlignment="Center" VerticalAlignment="Center">

【问题讨论】:

  • 我知道我问这个可能很愚蠢,但既然你没有提到它:你对local 标签的定义在哪里?你的Window 的属性上应该有xmlns:local="clr-namespace:MyNameSpace 之类的东西,对吗?如果是:转换器是否在不同的组件中?
  • 问起来一点也不傻。我已经在我的帖子中添加了更新。在那里你可以看到我在哪里定义了我的本地标签
  • 当我阅读答案时,看起来它运行正常。 XAML 编辑器有时会因引用而变得痛苦(我通过使用 Resharper 修复了它。虽然不是免费的)。对于您的第二个问题,您的 DataTrigger 专门更改了背景。 ControlTemplateDataGridRow 还是 DataGridCell
  • ControlTemplate 用于 DataGridRow。是的,它会构建,但是在 app.xaml 中,Binding 行仍然突出显示“资源 meanToBool 无法解析

标签: c# wpf xaml datagrid


【解决方案1】:

您的第一个问题看起来只是与 Visual Studio XAML 编辑器相关。有时可能会因为不识别参考而感到痛苦。 我个人通过...使用 ReSharper 解决了这个问题!

至于您的第二个问题,您明确设置了 Background 属性的样式。如果你想连续改变文字颜色,你可以为你的DataGrid创建一个RowStyle

                        <DataGrid.RowStyle>
                            <Style TargetType="{x:Type DataGridRow}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding MeanPost, Converter={StaticResource meanToBool}, ConverterParameter=0}" Value="0">
                                        <Setter Property="Foreground" Value="{StaticResource brushRowSend}"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </DataGrid.RowStyle>

【讨论】:

  • 感谢您的代码。当我运行应用程序时,我在错误列表中看到资源 MeanToBool 无法解析。这也是说我的转换器类在命名空间'clr-namespace:MyNameSpace'中不存在
  • 如果你在你的转换器中放了一个断点,它会通过吗?如果资源实际上没有被解析,代码应该抛出 XamlParseException 并阻止你运行它如果你可以正常运行,你应该没有问题
  • 它不再加载了。在 Binding{} 之后,我将 Value=0 更改为 Value="True"。我正在发生 XamlParseException。 “PresentationFramework.dll 中发生了‘System.Windows.Markup.XamlParseException’类型的第一次机会异常
  • {"'在 'System.Windows.Markup.StaticResourceHolder' 上提供值引发了异常。'行号 '292' 和行位置 '42'。”} 所以我的转换器类没有受到影响,但应用程序不再加载
【解决方案2】:

您是否构建了解决方案?

它的建筑是否正确??

我发现您的转换器代码中缺少右大括号。

这不是答案。由于我无法发表评论,因此我将其添加为答案。

【讨论】:

  • 是的,它构建得很好。数据网格正确显示所有数据。但是,我希望根据单元格的值将字体设置为不同颜色的单元格不起作用。例如,如果属性 MeanPost 小于 0,它应该是红色的。这没有发生
  • 那么您的第一个问题现在解决了吗?您能提供您的 xaml 代码以供我检查吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多