在初始化 属性 之前绑定到 属性
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 在加载此对象时刷新绑定。
我有一个 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 属性,您只需要在此 属性:
上实现 INotifyPropertyChangedprivate Project _LoadedProject;
public Project LoadedProject
{
get { return _LoadedProject; }
set
{
_LoadedProject = value;
OnPropertyChanged("LoadedProject");
}
}
这将强制您的 UI 在加载此对象时刷新绑定。