在初始化 属性 之前绑定到 属性

Bind to property before property is initialized

我有一个 class Project 正在通过序列化加载。我将此 class 的实例存储在 属性 LoadedProject 中。我正在尝试将标签绑定到名为 ProjectName 的项目 属性。在序列化完成之前 LoadedProject 为空。

我知道我必须将 PropertyChanged 的​​ DataContext 设置为不为空,但在序列化之前设置 DataContext 会导致 DataContext 为空。序列化后设置错过事件。

如果我绑定到子项 属性,如果父项为空,我应该在哪里设置 DataContext?

项目class:

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:

 <Label Content="{Binding Path=ProjectName, UpdateSourceTrigger=PropertyChanged, FallbackValue='No Project Loaded'}"></Label>

编辑 1: 必须绑定到 public 属性。将 ProjectName 从内部更改为 public。初始绑定现在有效。 PropertyChanged 仍然为空。

您需要在 view/viewmodel 绑定到

之外填充项目

您可以将标签移动到子 view/control 或者有一些启动逻辑

我看到你的 LoadedProject 是私有的,这肯定会导致一些绑定问题。首先确保 属性 设置为 public.

public Project LoadedProject { get; set; }

假设您直接绑定到 LoadedProject 属性,您只需要在此 属性:

上实现 INotifyPropertyChanged
private Project _LoadedProject;

    public Project LoadedProject
    {
        get { return _LoadedProject; }
        set 
        { 
            _LoadedProject = value;
            OnPropertyChanged("LoadedProject");
        }
    }

这将强制您的 UI 在加载此对象时刷新绑定。