C# WPF数据从项目a中的实例化类绑定到项目B

C# WPF数据从项目a中的实例化类绑定到项目B,c#,wpf,data-binding,C#,Wpf,Data Binding,我对从项目a中的实例化类到项目B的数据绑定存在问题。数据绑定“似乎”工作正常;然而,我肯定得到了一个不同的ClassA实例化 这是ClassA,它是另一个项目中的一个类。ClassA是一个控制台应用程序,有一个主应用程序 public class ClassA: INotifyPropertyChanged { private string _partNumber; private Guid _guid = Guid.NewGuid ( ); // Make a single

我对从项目a中的实例化类到项目B的数据绑定存在问题。数据绑定“似乎”工作正常;然而,我肯定得到了一个不同的ClassA实例化

这是ClassA,它是另一个项目中的一个类。ClassA是一个控制台应用程序,有一个主应用程序

public class ClassA: INotifyPropertyChanged
{
   private string _partNumber;
   private Guid _guid = Guid.NewGuid ( );

   // Make a singleton of this class so other classes have to request an instance
   private static readonly ClassA _Instance = new ClassA ( );

   //
   //.. Read in xml file "This executes properly - I've checked"
   //

   public static ClassA GetInstance ( )
   {
       return _Instance;
   }

   public string PartNumber
    {
        get
        {

            if ( string.IsNullOrEmpty ( _partNumber ) )
            {
                Console.WriteLine("Got PartNumber: " + _partNumber + "  GUID: " + _guid);
                return "Empty";
            }
            Console.WriteLine("Got PartNumber: " + _partNumber + "  GUID: " + _guid);
            return _partNumber;
        }
        set
        {
            if ( value == null )
            {
                throw new ArgumentNullException ( "value" );
            }
            Console.WriteLine("Set Partnumber: " + value + "  GUID: " + _guid);
            _partNumber = value;
        }
    }

}
这是ClassB,它是另一个项目中的一个类。ClassB是一个WPF应用程序

class ClassB : Binding
{
    public ClassB ( )
    {
        Initialize();
    }

    public ClassB ( string path ) : base ( path )
    {
        Initialize();
    }

    private void Initialize ( )
    {
        Source = ClassA.GetInstance();
    }
}
这是调用绑定的XAML代码

<controls:MetroWindow ... ...

   xmlns:db ="clr-namespace:EAS.GUI"

   <TextBlock  Grid.Row="1" Grid.Column="1" 
     Style="{StaticResource LblTextData}"   
     Text="{db:ClassB PartNumber, UpdateSourceTrigger=PropertyChanged, OneWay}" 

   ... ...

</controls:MetroWindow>

好的所以我改变了我的方法,去掉了
ClassB
,并从XAML命名空间定义中删除了
xmlns:db=“clr namespace:EAS.GUI”

在我的
MainWindow.xaml.cs
中,我在构造函数中添加了这一行: DataContext=ClassA.GetInstance()

然后在我的
main窗口.xaml中,我将文本块更改为:

<TextBlock  Grid.Row="1" Grid.Column="1" 
 Style="{StaticResource LblTextData}"
 Text="{Binding PartNumber, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>

现在,我在运行时的输出窗口中看到:


System.Windows.Data信息:10:无法使用绑定检索值,且不存在有效的回退值;改为使用默认值。BindingExpression:路径=零件号;DataItem=null;目标元素为“TextBlock”(名称=“”);目标属性为“Text”(类型为“String”)

如果没有更完整的代码示例,无法确定此问题的正确答案。最好是

在调试方面:您应该将
\u guid
字段标记为
只读
,为完整起见,将
private ClassA(){}
添加到
ClassA
类中,即使其构造函数私有,以防止代码通过
GetInstance()
方法以外的任何方式获取实例

正如您可能从上面猜到的,我怀疑您实际上在某个地方有一些代码(您没有在帖子中包含这些代码)创建了一个额外的
ClassA
实例。注意,在WPF中,XAML中的对象实例化依赖于类型的公共无参数构造函数。您可能在XAML的某处声明了
ClassA
类型的某个对象,导致WPF代表您创建额外的实例。在任何情况下,无论代码在何处执行此操作,也就是说,通过使构造函数私有化,您将防止它发生,很可能导致在编译时生成错误,从而直接导致问题


如果没有,那么您应该编辑您的问题,使其包含一个好的、完整的代码示例。

您的意思是
Text=“{db:ClassB…”
?我在您的XAML中没有看到任何
ClassB
引用。@BradleyDotNET感谢您的快速回复。ClassB是通过命名空间
xmlns:db=“clr namespace:EAS.GUI”引用的
没错,但你的文字上写的是“ClassA”而不是“ClassB”@BradleyDotNET谢谢。不幸的是,在stackoverflow中复制解决方案时,这是一个输入错误。我修复了输入错误。我试图模拟您的,它工作正常。可能如果您发布更多代码,它将有助于解决问题。感谢您的帮助。我将在明天的工作中尝试。不幸的是,我无法发布更多,因为很多代码都是p正确。如果您的解决方案不起作用,我将在明天发布更多代码。再次感谢。我按照您的建议做了,但仍然没有成功;但是,我确实做了一些更改,现在我实际遇到了一个错误。我在上面发布了我的更改。
<TextBlock  Grid.Row="1" Grid.Column="1" 
 Style="{StaticResource LblTextData}"
 Text="{Binding PartNumber, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>