私は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のコンセプトにはとても新しいので、一般的なアドバイスにも非常に感謝しています。
プロパティ(およびINotifyPropertyChanged実装)は、ウィンドウクラスにはなく、別のクラス(ビューモデルと呼ばれます)に配置する必要があります。両方のウィンドウは、DataContextを同じビューモデルクラスインスタンスに設定することによってビューモデルを共有します。 – Clemens
@Clemensだから、たとえば、あるウィンドウのcsで、プロパティとインターフェイスを持つViewModelクラスを作成し、次に同じウィンドウにxaml bndind DataConextを作成します。別のウィンドウxamlで、私はViewModelクラスを継承する名前空間への参照を行い、それにwindow2のdatacontextもバインドしますか?ありがとうございました! –
VMクラスをどこに置いても問題ありませんが、別のソースファイルに置くことをお勧めします。その後、メインウィンドウのDataContextをこのクラスのインスタンス(XAMLまたはコードビハインドのいずれか)に割り当てます。オプションウィンドウを表示する前に、DataContextを同じインスタンスに割り当てます。 – Clemens