2016-11-17 12 views
1

私は2つのウィンドウを持つアプリケーションを持っています。 1つはOptionsと呼ばれます。それはstringプロパティpath_to_pureをいくつかのファイルへのディレクトリを表しています。これは実行時にOpenFileDialogを介してユーザーが変更できます。別のウィンドウWindow2(別のXAMLファイル)では、そのプロパティを受け取り、そのファイルをそのプロパティWindow2に読み込むメソッドがあります。 両方のウィンドウにはINotyfyPropertyChangedインターフェイスが実装されています(問題がある場合)。 問題は、Window2コードビハインドファイルからウィンドウのpath_to_pureプロパティにアクセスする方法がわかりません。だから、それにアクセスする最も正しいWPFの方法は何ですか?別のウィンドウのコードビハインドから1つのウィンドウのプロパティにアクセスするには?

オプションウィンドウXAML:

<Window x:Class="PVT_Simulator.Options" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:PVT_Simulator" 
     mc:Ignorable="d" 
     Title="Global Options" Height="300" Width="300" 
     x:Name="Options_Window"> 
    <StackPanel DataContext="{Binding ElementName=Options_Window}"> 
     <TextBlock>Path to pure:</TextBlock> 
     <TextBlock Text="{Binding Path=path_to_pure, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap" Foreground="Blue"/> 
     <Button Name="btnPurePath" Click="btnPurePath_Click" Content="Change" HorizontalAlignment="Left"/> 
    </StackPanel> 
</Window> 

オプションウィンドウC#

public partial class Options : Window, INotifyPropertyChanged 
{ 
    private string _path_to_pure; 
    public string path_to_pure 
    { 
     get { return _path_to_pure; } 
     set 
     { 
      if (_path_to_pure != value) 
      { 
       _path_to_pure = value; 
       NotifyPropertyChanged("path_to_pure"); 
      } 
     } 
    } 

    public Options() 
    { 

     InitializeComponent(); 
     path_to_pure = "C:/Users/1/Dropbox/PVT_simulator/C# version/Components Lib/General Pure.txt"; // a default value 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void NotifyPropertyChanged(string propName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); 
    } 

    private void btnPurePath_Click(object sender, RoutedEventArgs e) 
    { 
     // creating a file dialog to change file direction 
     OpenFileDialog fd = new OpenFileDialog(); 
     fd.Filter = "Text files (*.txt)|*.txt"; 
     if (fd.ShowDialog() == true) 
     { 
      path_to_pure = fd.FileName; 
     } 

    } 

} 

ウィンドウ2 C#

public Window2() 
{ 
    InitializeComponent(); 
    // generating pure components names 
    string path_to_pure = // I need to acces Options path_to_pure property here! 
    string[][] data = System.IO.File.ReadLines(path_to_pure) 
         .Skip(2).Select(l => l.Split('\t') 
         .ToArray()) 
         .ToArray(); 
} 

私はWPFとMVVMのコンセプトにはとても新しいので、一般的なアドバイスにも非常に感謝しています。

+3

プロパティ(およびINotifyPropertyChanged実装)は、ウィンドウクラスにはなく、別のクラス(ビューモデルと呼ばれます)に配置する必要があります。両方のウィンドウは、DataContextを同じビューモデルクラスインスタンスに設定することによってビューモデルを共有します。 – Clemens

+0

@Clemensだから、たとえば、あるウィンドウのcsで、プロパティとインターフェイスを持つViewModelクラスを作成し、次に同じウィンドウにxaml bndind DataConextを作成します。別のウィンドウxamlで、私はViewModelクラスを継承する名前空間への参照を行い、それにwindow2のdatacontextもバインドしますか?ありがとうございました! –

+2

VMクラスをどこに置いても問題ありませんが、別のソースファイルに置くことをお勧めします。その後、メインウィンドウのDataContextをこのクラスのインスタンス(XAMLまたはコードビハインドのいずれか)に割り当てます。オプションウィンドウを表示する前に、DataContextを同じインスタンスに割り当てます。 – Clemens

答えて

1

コメントにClemensがすでに述べたように、まず適切なMVVMの概念を使用するようにしてください。だからあなたのOptions-View(あなたのオプションウィンドウ)とあなたのWindow2-Viewはそれぞれ、それぞれのViewModel(OptionsViewModelとWindow2ViewModel ...の名前が不足している)を持っているはずです。 より早く始めるために、MVVMフレームワーク/ライブラリを使用することをお勧めします。そこに良いオプションがたくさんあります、個人的に私はMVVMLight by GalaSoftを使用したいと思います。そこには、すでにINotifyPropertyChangedを実装しているViewModelBaseクラスや、ViewModel間でメッセージを簡単に送信できるMessengerなどがあります(たとえば、Messengerを使用してViewModels間でpath_to_pureを渡すことができます)。

MVVMLightには、モデル、ViewModel、ビューの間でコードを整理する方法について「正しい方向」に導くプロジェクトテンプレートもあります。もちろん、それを行う絶対的な正しい方法はありませんが、WPF/MVVMを学ぶときに非常に役立つことがわかりました。

関連する問題