【问题标题】:Wpf Resource: "Unknown Build Error, 'Path cannot be null..."Wpf 资源:“未知的构建错误,'路径不能为空......”
【发布时间】:2010-05-14 01:30:41
【问题描述】:

以下是来自 xaml 的 sn-p,在 Control 中定义 DataGrid,定义模板选择器。

<DataGrid.Resources>
    <selector:CurrencyColorSelector x:Key="currencyColorSelector">
        <selector:CurrencyColorSelector.NegativeTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Balance, StringFormat=n}" Background="Red"/>
            </DataTemplate>
        </selector:CurrencyColorSelector.NegativeTemplate>
        <selector:CurrencyColorSelector.NormalTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Balance, StringFormat=n}"/>
            </DataTemplate>
        </selector:CurrencyColorSelector.NormalTemplate>
    </selector:CurrencyColorSelector>
</DataGrid.Resources>

现在,抛出错误:“未知构建错误,'路径不能为空。参数名称:路径第 27 行位置 79。'”(编译器或 xaml 验证错误)。

编辑

重新启动 Visual Studio 2010 后,我得到以下信息:

XML 命名空间“clr-namespace:EveTrader.Wpf.Selectors;assembly=EveTrader.Wpf”中不存在标签“CurrencyColorSelector”。第 27 行第 18 行。

这让事情变得更奇怪了,因为我什至对班级有智能感知。


我不知道这条路径来自哪里,我的示例也没有显示任何内容。如果双击错误,它会指向&lt;selector:CurrencyColorSelector x:Key="currencyColorSelector"&gt; 的末尾(第 27 行)。

有没有人遇到过这样的问题并有解决方案?该示例来自此处:http://www.wpftutorial.net/DataGrid.html(行详细信息取决于数据类型)

澄清

这是在 .net 4.0 下。问题与 CurrencyColorSelector 有关,因为如果在 DataGridTemplateColumn 中单独使用模板,模板本身可以正常工作。 CurrencyColorSelector 派生自 DataTemplateSelector

CurrencyColorSelector

namespace EveTrader.Wpf.Selectors
{
    public class CurrencyColorSelector : DataTemplateSelector
    {
        public DataTemplate NegativeTemplate { get; set; }
        public DataTemplate NormalTemplate { get; set; }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            var data = item as DisplayWallets;

            if (data == null)
                return base.SelectTemplate(item, container);

            if (data.Balance < 0m)
                return NegativeTemplate;
            return NormalTemplate;
        }
    }
}

显示钱包

public class DisplayWallets
{
    public string Name { get; set; }
    public decimal Balance { get; set; }
}

Xaml 选择器定义

<UserControl x:Class="EveTrader.Wpf.WalletsView"
             xmlns:selector="clr-namespace:EveTrader.Wpf.Selectors;assembly=EveTrader.Wpf">

【问题讨论】:

  • 您能否发布货币选择器的代码以及您的 XAML 文件中定义的 selector: 什么?
  • 我想知道它是否与需要添加到 XAML 项目中的 EveTrader.Wpf 的引用有关?也许他们去了不同的输出文件夹,如果没有参考,它可能会在运行时失败。但仍然没有解释设计时错误。
  • 您是否考虑向 VS 支持团队报告此问题?保证成为 Visual Studio 本身的错误似乎很奇怪且无法解释。
  • Igor:EveTrader.Wpf 是 xaml 所在的程序集/项目。

标签: c# wpf xaml


【解决方案1】:

好的,我修好了。问题是选择器的定义:

xmlns:selector="clr-namespace:EveTrader.Wpf.Selectors;assembly=EveTrader.Wpf".

由于 CurrencyColorSelector 类型驻留在 EveTrader.Wpf 程序集中,此定义创建了一个循环引用,导致错误 - 编译器尝试编译程序集 EveTrader.Wpf,但由于 selector 的定义,它试图首先创建 EveTrader.Wpf。这继续令人作呕。修复很简单:删除程序集定义:xmlns:selector="clr-namespace:EveTrader.Wpf.Selectors"

我在通宵工作后睡了几个小时后解决了这个问题,这再次证明,需要睡眠。无论如何感谢伊戈尔的帮助。

【讨论】:

    【解决方案2】:

    Binding 中的路径通常是单词 Binding 之后的位。

    {Binding MyCustomText}
              ^
              |
            Binding
    
    <!--OR-->
    
    {Binding Path=MyCustomText}
                   ^
                   |
                 Binding
    

    这个错误意味着绑定有问题。

    StringFormat Binding 属性是在从内存到 .NET 3.5 的服务包中引入的。检查您的 WPF 版本是否支持 StringFormat 的一个好方法是查看类 BindingBase 是否具有属性 StringFormat

    有了更新的信息,我什么也没得到 :( 看起来应该可以了。

    【讨论】:

    • 我使用的是 .net 4.0。将 Binding 更改为 Path= 并没有改变任何东西。此外,问题只是从资源开始出现 - 在其他地方使用 StringFormat 就像一个魅力。
    • 对,那一定是别的东西。
    • 我修好了,解决方案出奇的简单。
    猜你喜欢
    • 2011-09-09
    • 2018-07-18
    • 1970-01-01
    • 2021-05-04
    • 2012-12-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多