もう1つのWPFバインディングの問題があります。ちょうど私がこのことを理解したと思うと、私はもっと多くの問題に遭遇します...:SWPFバインディングの問題 - UI更新、オブジェクトがありません
とにかく...私はファイルを選択するためのカスタムユーザーコントロールを作成しました。これは単純なテキストボックスで、その後にグリッド内のボタンが表示されます。私が動作しているコントロールのプロパティはFilePathと呼ばれ、このコントロールのTextBoxはそのプロパティにバインドされています。ボタンをクリックすると、SaveFileDialogが開き、ユーザーがファイルを選択します。ユーザーがファイルを選択すると、UIが正しく更新されます。
問題は、オブジェクトをコントロールにバインドすると(この例では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
}
それは注目に値するかもしれ既存のオブジェクトでウィンドウをロードすると、ユーザコントロールは正しく表示されますが、バインドされているオブジェクト内の変更はまだ登録されません。
あなたに必要な情報があれば教えてください。事前に
おかげで、
ソニー
EDIT:私はこの問題を回避する方法を見つけたが、これはおそらく、良い解決策ではありません。デバッガを注意深く見て、コントロール内で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;
}
}
ありがとうございます。それがそれでした。 –