XAML无法从其他程序集设置基类的属性值

时间:2012-06-28 10:27:53

标签: c# xaml

很难想出一个简洁的标题!

我在一个解决方案中有两个WPF项目。第一个,WpfApplication定义了Class1。第二,WpfControlLibrary定义继承自Class1的Class2,继承自Class2的Class3和UserControl1。它们如下所示:

WpfApplication Class1

namespace WpfApplication5
{
  public class Class1
  {
    public string Property1 { get; set; }
  }
}

WpfControlLibrary Class2和Class3

namespace WpfControlLibrary1
{
  public class Class2
  {
    public string Property2 { get; set; }
  }
  public class Class3 : Class2
  {
    public string Property3 { get; set; }
  }
}

总之,Class 1有Property1,Class2有Property1(通过继承)和Property2,Class3有Property1和Property2(都是继承)和Property3。用户控件的XAML是:

<UserControl x:Class="WpfControlLibrary1.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:b="clr-namespace:WpfApplication5;assembly=WpfApplication5"
         xmlns:l="clr-namespace:WpfControlLibrary1"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
  <UserControl.Resources>
      <b:Class1 x:Key="test1" Property1="xxx" />
      <l:Class2 x:Key="test2" Property1="xxx" Property2="yyy" />
      <l:Class3 x:Key="test3" Property2="yyy" Property3="zzz" />
      <l:Class3 x:Key="test4">
        <l:Class3.Property1>xxx</l:Class3.Property1>
        <l:Class3.Property2>yyy</l:Class3.Property2>
        <l:Class3.Property3>zzz</l:Class3.Property3>
      </l:Class3>
  </UserControl.Resources>
  <Grid>

  </Grid>

问题是XAML不会编译,并给出以下错误:

The property 'Property1' does not exist in XML namespace 'clr-namespace:WpfControlLibrary1'.
The property 'Property1' was not found in type 'Class2'.
The attachable property 'Property1' was not found in type 'Class3'.

看起来XAML无法处理从不同程序集继承的属性。这是对的,还是我一直在看它太久了。我尝试过设置Property1和事件的不同形式b:Property1=b:Class1.Property1=,但似乎都没有效果。 或者我一直在看这个太长时间和过于复杂的事情?

1 个答案:

答案 0 :(得分:0)

我将在这里添加我自己的答案,尝试解释我认为发生了什么,尽管我上面引用了一个不好的例子,对于其他任何人来说。

使用XAML从其他程序集实例化对象时,命名空间如下所示:

xmlns:b="clr-namespace:WpfApplication5;assembly=WpfApplication5"

注意它有一个名为的程序集。它似乎也将程序集复制到bin文件夹中。在我的情况下,发生了一些疯狂的事情,并且复制的程序集已经过了几个小时。因此,即使c#可以编译,XAML也不能。发生了一些魔法,在Configuration Manager中神秘地取消了这个程序集的构建。但是,再次检查并重建仍然没有重建exe。在这种兴奋期间,Visual Studio崩溃并重新启动(仅仅是我或VS2010会发生这种情况)。

最后,我不得不删除所有DLL项目并自行构建主应用程序。然后我可以重新添加DLL项目并编译。然后一切都按预期工作。