У меня возникла еще одна проблема с привязкой WPF. Просто, когда я думаю, что все это выяснили, я сталкиваюсь с большим количеством проблем ...: S
В любом случае ... Я создал пользовательский элемент управления для выбора файлов. Это простое текстовое поле, за которым следует кнопка, содержащаяся в сетке. Свойство элемента управления, с которым я работаю, называется FilePath, и TextBox для этого элемента управления привязан к этому свойству. При нажатии кнопки открывается SaveFileDialog, и пользователь выбирает файл. Пользовательский интерфейс корректно обновляется после выбора файла пользователем.
Проблема, с которой я столкнулся, заключается в том, что когда я связываю объект с элементом управления (в данном случае у меня есть объект со свойством DocumentFilePath), объект не обновляется при выборе нового файла.
Вот соответствующий код в моем пользовательском контроле:
public static readonly DependencyProperty FilePathProperty = DependencyProperty.Register("FilePath", typeof(string), typeof(FileSave), new UIPropertyMetadata(string.Empty, OnFilePathChanged));
public string FilePath
{
get
{
return this.GetValue(FilePathProperty) as string;
}
set
{
this.SetValue(FilePathProperty, value);
this.OnPropertyChanged("FilePath");
}
}
private void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
private static void OnFilePathChanged(object sender, DependencyPropertyChangedEventArgs e)
{
((FileSave)sender).OnPropertyChanged("FilePath");
}
И пользовательский элемент управления добавляется в мое окно программно, используя отражение на моем объекте:
private void AddFileSave(PropertyInfo pi)
{
FileSave fs = new FileSave();
Binding b = new Binding(pi.Name);
fs.SetBinding(FileSave.FilePathProperty, b);
this.AddToGrid(fs); //adds the control into my window's grid in the correct row and column; nothing fancy here
}
Возможно, стоит отметить, что если я загружаю окно с существующим объектом, мой пользовательский элемент управления отображается правильно, но все равно не будет регистрировать какие-либо изменения в объекте, с которым он связан.
Пожалуйста, дайте мне знать, если вам, ребята, нужна дополнительная информация.
Заранее спасибо,
Sonny
РЕДАКТИРОВАТЬ: Я нашел способ обойти проблему, но это, вероятно, не является хорошим решением. Внимательно наблюдая за отладчиком, я обнаружил, что, когда я установил свойство FilePath в моем элементе управления, объект не связывался. Если кто-то может пролить свет на это, я был бы очень признателен. В то же время я изменил код, открывающий мой SaveFileDialog, чтобы он выглядел так:
private void Button_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
ofd.Multiselect = false;
ofd.Title = "Select document to import...";
ofd.ValidateNames = true;
ofd.ShowDialog();
if (this.GetBindingExpression(FilePathProperty) == null)
{
this.FilePath = ofd.FileName;
}
else //set value on bound object (THIS IS THE NEW PORTION I JUST ADDED)
{
BindingExpression be = this.GetBindingExpression(FilePathProperty);
string propName = be.ParentBinding.Path.Path;
object entity = be.DataItem;
System.Reflection.PropertyInfo pi = entity.GetType().GetProperty(propName);
pi.SetValue(entity, ofd.FileName, null);
}
if (!string.IsNullOrWhiteSpace(this.FilePath))
{
_fileContents = new MemoryStream();
using (StreamReader sr = new StreamReader(this.FilePath))
{
_fileContents = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(sr.ReadToEnd()));
}
}
else
{
_fileContents = null;
}
}