C# 在初始化属性之前绑定到属性
我有一个通过序列化加载的类C# 在初始化属性之前绑定到属性,c#,wpf,data-binding,datacontext,C#,Wpf,Data Binding,Datacontext,我有一个通过序列化加载的类项目。我正在将此类的一个实例存储在属性LoadedProject中。我正在尝试将标签绑定到名为ProjectName的项目属性。在序列化完成之前,LoadedProject为空 我知道我必须将PropertyChanged的DataContext设置为不为null,但是在序列化之前设置DataContext会导致DataContext为null。在序列化后设置它会错过事件 如果我绑定到一个子属性,如果父属性为null,我应该在哪里设置DataContext 项目类别:
项目
。我正在将此类的一个实例存储在属性LoadedProject
中。我正在尝试将标签绑定到名为ProjectName
的项目属性。在序列化完成之前,LoadedProject
为空
我知道我必须将PropertyChanged的DataContext设置为不为null,但是在序列化之前设置DataContext会导致DataContext为null。在序列化后设置它会错过事件
如果我绑定到一个子属性,如果父属性为null,我应该在哪里设置DataContext
项目类别:
public class Project : INotifyPropertyChanged
{
private string _projectFilePath;
internal string ProjectFilePath
{
get { return _projectFilePath; }
set
{
_projectFilePath = value;
this.OnPropertyChanged("ProjectName");
}
}
public string ProjectName
{
get { return Path.GetFileNameWithoutExtension(ProjectFilePath); }
}
internal static Project Load(string fileName)
{
using (var stream = File.OpenRead(fileName))
{
var ds = new DataContractSerializer(typeof(Project));
return ds.ReadObject(stream) as Project;
}
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(
this, new PropertyChangedEventArgs(propName));
}
}
Main.xaml.cs
private Project LoadedProject { get; set; }
...
bool? result = dlg.ShowDialog();
if (result == true)
{
// Open document
string filename = dlg.FileName;
DataContext = LoadedProject; //LoadedProject is currently null. Assigning the DataContext here will not work
LoadedProject = Project.Load(filename);
}
...
XAML:
编辑1:
必须绑定到公共属性。将项目名称从内部更改为公共。初始绑定现在可以工作了。PropertyChanged仍然为空。您需要在项目绑定到的视图/视图模型之外填充项目
您可以将标签移动到子视图/控件或具有一些启动逻辑。我看到您的LoadedProject是私有的,这肯定会导致一些绑定问题。首先确保属性设置为公共
public Project LoadedProject { get; set; }
假设您直接绑定到LoadedProject属性,只需在此属性上实现INotifyPropertyChanged:
private Project _LoadedProject;
public Project LoadedProject
{
get { return _LoadedProject; }
set
{
_LoadedProject = value;
OnPropertyChanged("LoadedProject");
}
}
这将强制用户界面在加载该对象时刷新该对象的绑定。如何
DataContext=Project.Load(filename)代码>?否则,LoadedProject
应该是另一个视图模型类中的属性。@Clemens在序列化过程中触发propertychange事件,此时DataContext仍然为空。加载后分配DataContext仍将错过propertychange事件。我不确定是否理解。我正在将标签绑定到LoadedProject.ProjectName。将OnPropertyChanged添加到LoadedProject设置事件如何修复此问题?@Brandon,因为xaml实际上会在后台创建两个绑定,一个绑定到LoadedProject
,另一个绑定到“第一个绑定绑定到的对象”.ProjectName
。因此,如果树中的任何项引发属性更改,它将刷新所有子项。但是,由于LoadedProject
位于Main.xaml.cs中,因此您可能希望将其设置为一个,而不是实现inotifificationpropertychangeacutly,这将需要更多的更改。您的DataContext需要设置为this
,您的xaml更改为{Binding Path=LoadedProject.ProjectName,…
@ScottChamberlain在回答和注释中进行更改,Project类和Main.xaml.cs中的PropertyChanged都为null。我正在设置DataContext=这正好在Project.Load()之前或者,您可以给父元素一个x:Name属性,并使用ElementName绑定,例如:{binding LoadedProject.ProjectName,ElementName=ElementName}。这与将DataContext设置为自身具有相同的效果。
private Project _LoadedProject;
public Project LoadedProject
{
get { return _LoadedProject; }
set
{
_LoadedProject = value;
OnPropertyChanged("LoadedProject");
}
}