2017-11-17 5 views
0

2つのウィンドウで構成されるwpfに何かをバインドしようとしています。私は、最初のウィンドウにデータを結合することが可能ですが、実際にそれが第二のウィンドウで実行する必要がありますどのように私の心を置くことはできません。別のウィンドウにデータをバインドする

メインウィンドウコード:

public partial class MainWindow : Window 
{ 
    private string repeatNumber; 
    public MainWindow() 
    {   
     InitializeComponent(); 

     string[] assignments = new string[] { "https://cdn2.iconfinder.com/data/icons/animals/48/Turtle.png", "https://cdn2.iconfinder.com/data/icons/animals/48/Butterfly.png", "https://cdn2.iconfinder.com/data/icons/animals/48/Dolphin.png", "https://cdn2.iconfinder.com/data/icons/animals/48/Elephant.png", "https://cdn2.iconfinder.com/data/icons/animals/48/Hippopotamus.png", "https://cdn2.iconfinder.com/data/icons/animals/48/Panda.png" }; 
     Random rnd = new Random(); 

     string[] randomingArray = assignments.OrderBy(x => rnd.Next()).ToArray(); 


    List<Images> animals = new List<Images>(); 

     for (int i = 1; i < 100; i++) 
     { 
      if (i == 9) 
      { 
       repeatNumber = randomingArray[i % randomingArray.Length]; 
       animals.Add(new Images() { Source = repeatNumber, Number = i }); 
      } 
      else if ((i % 9) == 0) 
      { 
       animals.Add(new Images() { Source = repeatNumber, Number = i }); 
      } 
      else 
      { 
       animals.Add(new Images() { Source = randomingArray[i % rnd.Next(1,5)], Number = i }); 
      } 
      ItemsControl1.ItemsSource = animals; 
     } 
    } 


    private void btn1_Click(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("test"); 
    } 
    private void btn2_Click(object sender, RoutedEventArgs e) 
    { 
     Window1 window1 = new Window1(); 
     window1.Show(); 
     } 
    } 
} 

class Images 
{ 
    public int Number { get; set; } 
    public string Source { get; set; } 
} 

メインウィンドウのXAML:

<Grid> 
    <ListBox x:Name="ItemsControl1"> 

     <ListBox.ItemsPanel> 

      <ItemsPanelTemplate> 

       <UniformGrid Columns="5"> 
       </UniformGrid> 

      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Border BorderBrush="Black" BorderThickness="3" Width="Auto" Height="Auto"> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Number}"/> 
         <Image Source="{Binding Source}" Margin="0,0,5,0"/> 
        </StackPanel> 
       </Border> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 

    </ListBox> 
    <Grid> 
     <Button x:Name="btn1" Click="btn1_Click" Height="20" VerticalAlignment="Bottom" Margin="127,0,316,0" Content="Instruction"></Button> 
     <Button x:Name="btn2" Click="btn2_Click" Height="20" VerticalAlignment="Bottom" Margin="300,0,109,0" Content="Results" Width="74"> </Button> 

    </Grid> 
</Grid> 

ウィンドウ2のコードはちょうどです:今ちょうど私windows2ため

public class Window2 : Window 
{ 
    //should return the value of repeatNumber 
} 

XAML:

<Grid> 


</Grid> 

私は、MainWindow repeatNumberから値を取得しようとしています。どのように私はそれを達成することができますか?

+0

他のウィンドウにバインドする変数をコンストラクタの引数として渡すことができます。または、window2コードビハインドの下でパブリックプロパティとして定義することもできます。より良いアプローチは、おそらく共通のビューモデルを定義し、コンストラクタを使用して共有することです。 – mcy

+1

本当にこのhttps://msdn.microsoft.com/en-us/magazine/dd419663.aspxを見てください。 MVVMを使用すると、ウィンドウのロジックをviewmodelというクラスに持ち込むことができます。この単一のクラスを使用して、任意のウィンドウまたはユーザーコントロールにavailablaデータを作成することができます –

答えて

0

以下のように、パラメータとしてコンストラクタに渡すことができます。

public class Window2 : Window 
{ 
    public string RepeatNumber{get;set;} 

    public Window2(string repeatNumber) 
    { 
    RepeatNumber = repeatNumber; 
    } 
} 

また、あなたがメインウィンドウ

private void btn2_Click(object sender, RoutedEventArgs e) 
{ 
     Window1 window1 = new Window1(); 
     window1.Show(); 
     string value = window1.RepeatNumber; //Do what you want. 
} 

ベストアプローチ(私の意見)に戻ってそれにアクセスすることができますがあなたのような問題に対処するためのMVVMパターンを使用することです。

+0

こんにちは!あなたの答えをありがとう!私はこのボタンを終了した後、MVVMを調べます。最初からこれをしていたはずです。私はあなたのコードを試しましたが、エラーが出ます - 'Window1'に 'RepeatNumber'の定義が含まれていません。この行では、文字列値= window1.RepeatNumber; - どうすればこの問題を解決できますか?また、 - RepeatNumberから画像を取得したい場合はメモを、私の.xamlファイルではanyhtingする必要がありますか?ありがとうございました! – Noctii

関連する問題