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");
        }
    }