2010-05-14 78 views
0

以下是xaml中定义模板选择器的控件中定义DataGrid的代码片段。现在Wpf资源:“未知构建错误,路径不能为空...”

<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的重新启动后,我得到如下:

'CurrencyColorSelector' 不存在XML命名空间“CLR的命名空间中的标签:EveTrader.Wpf.Selectors ;装配= EveTrader.Wpf”。第27行18.

这使得它甚至更加诡异,因为我甚至对这个班有智慧。


我不知道这个路径来自哪里,我的示例也没有显示它的任何内容。如果双击错误,则指向<selector:CurrencyColorSelector x:Key="currencyColorSelector">(第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; 
     } 
    } 
} 

DisplayWallets

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"> 
+0

哪一行是第27行?澄清了 – 2010-05-14 01:34:34

+0

。谢谢 – Femaref 2010-05-14 01:38:13

+0

嗯,有趣。 – 2010-05-14 01:42:09

回答

3

好吧,我固定它。问题在于选择器的定义:

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

作为类型CurrencyColorSelector驻留在EveTrader.Wpf组件,该定义创建了所创建的错误循环引用 - 编译器试图编译组件EveTrader.Wpf,但由于selector的defition的,它试图建立首先是EveTrader.Wpf。这继续令人难以置信。修复很简单:删除程序集定义:xmlns:selector="clr-namespace:EveTrader.Wpf.Selectors"

我解决了这个问题后,经过了一夜的睡眠几个小时后,这再次证明,需要睡眠。无论如何感谢伊戈尔的帮助。

0

绑定中的路径通常是遵循单词绑定的位。

{Binding MyCustomText} 
     ^
      | 
     Binding 

<!--OR--> 

{Binding Path=MyCustomText} 
      ^
       | 
      Binding 

此错误表示绑定有问题。

StringFormat绑定属性是从内存中引入Service Pack到.NET 3.5的。检查您的WPF版本是否支持 StringFormat的一个好方法是查看类 BindingBase是否有属性 StringFormat

有了更新informatin我没有什么:(看起来像它应该工作。

+0

我正在使用.net 4.0。将绑定更改为路径=不会改变任何内容。此外,问题只是随资源出现 - 在其他地方使用StringFormat,像魅力一样工作。 – Femaref 2010-05-14 01:48:38

+0

对,那么一定是别的东西。 – 2010-05-14 01:52:38

+0

更新了它......它变得更加怪异。 – Femaref 2010-05-14 02:11:34