Имам клас Project
, който зареждам чрез сериализация. Съхранявам екземпляр на този клас в свойство LoadedProject
. Опитвам се да свържа етикет към свойство на Project, наречено ProjectName
. Докато сериализацията приключи, LoadedProject
е нула.
Разбирам, че трябва да настроя DataContext за PropertyChanged да не е null, но настройването на DataContext преди сериализация води до това, че DataContext е null. Задаването му след сериализация пропуска събитието.
Ако се обвързвам към дъщерно свойство, къде трябва да задам DataContext, ако родителят е null?
Клас на проекта:
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: Трябва да се свърже с публични свойства. Името на проекта е променено от вътрешно на публично. Първоначалното обвързване вече работи. PropertyChanged все още е нула.
DataContext = Project.Load(filename);
? В противен случайLoadedProject
трябва да бъде свойство в друг клас модел на изглед. - person Clemens   schedule 06.03.2015