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

时间:2015-03-06 13:47:22

标签: c# wpf data-binding datacontext

我有一个课程Project,我通过序列化加载。我将此类的实例存储在属性LoadedProject中。我试图将标签绑定到名为ProjectName的Project的属性。在序列化完成之前,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:

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

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

2 个答案:

答案 0 :(得分:1)

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

public Project LoadedProject { get; set; }

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

private Project _LoadedProject;

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

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

答案 1 :(得分:-1)

您需要在视图/ viewmodel之外填充项目

您可以将标签移动到子视图/控件或具有一些启动逻辑