2011-01-12 7 views
1

メインウィンドウとダイアログボックスの間でいくつかのデータを渡すか、共有する簡単な方法を見つけようとしています。ダイアログボックスからデータを取り出す方法は?

メインウィンドウには、ダイアログボックスに渡して編集可能な変数のコレクションがあります。

私は今それをやった方法、私は、ダイアログボックスのコンストラクタにリストを渡しです:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var window = new VariablesWindow(_templateVariables); 
    window.Owner = this; 
    window.ShowDialog(); 
    if(window.DialogResult == true) 
     _templateVariables = new List<Variable>(window.Variables); 
} 

そしてそこに、私は深いコピーにリストが必要と思い、

public partial class VariablesWindow : Window 
{ 
    public ObservableCollection<Variable> Variables { get; set; } 

    public VariablesWindow(IEnumerable<Variable> vars) 
    { 
     Variables = new ObservableCollection<Variable>(vars); 
     // ... 

編集時に、ユーザーが実際に「保存」を押すまでメインウィンドウに反映されません。

これは正しいアプローチですか?もしそうなら、ObservableCollectionを簡単にコピーする簡単な方法はありますか?今のところ、変数は浅いコピーしかないので変更されていると思います。

答えて

2

私はここに正しいアプローチをしていると思いますが、ObservableCollectionの詳細なコピーを作成する必要があります。そう、「変数」あなたのクラスがクローン化可能であることを確認して実行するには、この拡張メソッドが役立つかもしれない

foreach(var item in vars) 
{ 
    Variables.Add((Variable)item.Clone()); 
} 
+0

+1あなたの答えは私の上になります。私は明らかに混乱していた:) –

+0

ああ! 'ICloneable'!私は「クラスがコピーコンストラクタを実装しているので、拡張子を書くことができるかどうかをチェックするにはどうすればよいか」と考えようとしていました...これはうまくいくでしょう。 – mpen

1

ダイアログが開いている間にメインフォームを更新する場合は、イベントを使用して2つのフォーム間で通信します。メインフォームが処理できるダイアログクラスからイベント( "ItemAdded"など)を公開します。そのイベントが発生したら、必要に応じてメインフォームを更新します。

+1

実際には、WPFのShowDialogはNullableを返します

+0

私は「ユーザーが実際に「保存」を押すまで、メインウィンドウに反映されません*意図された*行動として。私はそれを直ちに更新する必要も、またそれを必要としない。しかし、将来のいくつかのダイアログボックスのための提案をありがとう。 – mpen

+0

@Rewinder:D'oh、それを修正します、ありがとう。 –

1

(ICloneableを実装しよう)誰か:それは少し私のダイアログウィンドウを簡素化

public static IEnumerable<T> DeepCopy<T>(this IEnumerable<T> collection) where T : ICloneable 
{ 
    return collection.Select(x => (T) x.Clone()); 
} 

public partial class VariablesWindow : Window 
{ 
    public ObservableCollection<TemplateVariable> Variables { get; private set; } 

    public VariablesWindow(IEnumerable<TemplateVariable> vars) 
    { 
     Variables = new ObservableCollection<TemplateVariable>(vars.DeepCopy()); 
関連する問題