本当にやりたいのは、MVVMパターンを使用して、ロジックをビューから分割することです。そうすれば、子ウィンドウ自体ではなく、子ウィンドウを操作するものにViewModelを渡すことができます。
たとえば、子ウィンドウの基本的なViewModelは次のようになります。
public class ChildWindowViewModel: INotifyPropertyChanged {
private string _title;
public string Title{
get { return _title; }
set{if (value != _title){
_title = value;
OnPropertyChanged("Title");
}}
}
private void OnPropertyChanged(string propertyName){
var handle = PropertyChanged;
if (handle != null){
handle(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
次に、次のように子ウィンドウを作成するときに、DataContextをビューモデルに設定します。
//Creating the child window
ChildWindow child = new ChildWindow();
ChildWindowViewModel childViewModel = new ChildWindowViewModel();
child.DataContext = childViewModel;
//do stuff with child...
次のように、子ウィンドウのタイトルをXamlのViewModelにフックします。
<Namespace:ChildWindow
x:Class="Namespace.MyClass">
<Namespace:ChildWindow.Title>
<TextBlock Width="300" TextTrimming="WordEllipsis" Text="{Binding Path=Title}/>
</Namespace:ChildWindow.Title>
</Namespace:Childwindow>
次に、タイトルを変更したいときに使用できます
childViewModel.Title = "A Very Long Title That Will Be Cut Short In Its Prime";
ViewModelにタイトルを設定すると、PropertyChangedイベントがトリガーされ、Xamlビューが新しく設定された値で更新されます。これは非常に長い道のりのように思えるかもしれませんが、これによって数分間何ができるかを考えると、いくつかの大きなメリットがあります。バインディングは、単純なタイトルテキストをはるかに超えています...
うまくいけば、それはすべてそのままで動作しますが、私はメモリからそれを行っているので、間違いをお詫びします...