C# WPF数据从项目a中的实例化类绑定到项目B
我对从项目a中的实例化类到项目B的数据绑定存在问题。数据绑定“似乎”工作正常;然而,我肯定得到了一个不同的ClassA实例化 这是ClassA,它是另一个项目中的一个类。ClassA是一个控制台应用程序,有一个主应用程序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
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}"/>