我有一个课程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。
答案 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之外填充项目
您可以将标签移动到子视图/控件或具有一些启动逻辑