2014-05-07 4 views
-1

Im новый здесь и относительный новичок с программированием на C#. У меня проблема с моей маленькой программой, которую я пытаюсь собрать. он должен иметь три окна (это на немецком, но это легко понять). В первом он должен иметь 4 машины с ценой, мощностью и моделью в datagrid i DGrid. Когда вы нажимаете на кнопку ниже, появляется второе окно, и вы можете выбрать, какой тип страхования вы хотите, и если вы будете платить за него каждый год, или каждые полгода, и т.д. ... и когда вы нажимаете появляется кнопка под третьим окном, и сумма, которую вы должны заплатить, зависит от модели вашего автомобиля (которую вы выбрали в первом окне) и страховки, которую вы выбрали во втором окне. В любом случае, я сделал первые 2 окна, и он работает исправно, но проблема в том, что я не знаю, как подключить автомобиль, который я выбрал в первом окне (классе), с третьим окном (где он делает вычисления) , Если я пишу Autos x = (Autos) DGrid.SelectedItem; в третьем окне он говорит, что не распознает имя DGrid (которое инициализируется в первом).Как подключить элемент datagrid к другому классу

Итак, вопрос: как получить третье окно, чтобы использовать выбранный элемент из первого, чтобы сделать вычисления?

Вот код - первое окно;

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace Versicherungsrechner 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      Autos a1 = new Autos("Ferrari", 220, 50000); 
      Autos a2 = new Autos("Lamborghini", 320, 150000); 
      Autos a3 = new Autos("Maseratti", 520, 250000); 
      Autos a4 = new Autos("BMW", 250, 55000); 
      InitializeComponent(); 
      Autos[] auto = new Autos[] { a1, a2, a3, a4 }; 

      DGrid.ItemsSource = auto; 
     } 

     public void OnClick(object sender, RoutedEventArgs e) 
     { 
      Details d = new Details(); 
      d.Owner = this; 
      d.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner; 
      d.ShowDialog(); 
     } 
    } 
} 

Второе окно:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 

namespace Versicherungsrechner 
{ 
    /// <summary> 
    /// Interaction logic for Details.xaml 
    /// </summary> 
    public partial class Details : Window 
    { 
     public Details() 
     { 
      InitializeComponent(); 
     } 

     public void AnzeigenClick(object sender, RoutedEventArgs e) 
     { 
      Ausgabe a = new Ausgabe(); 
      a.Owner = this; 
      a.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner; 
      a.ShowDialog(); 
     } 
    } 
} 

И третье:

namespace Versicherungsrechner 
{ 
    /// <summary> 
    /// Interaction logic for Ausgabe.xaml 
    /// </summary> 
    public partial class Ausgabe : Window 
    { 
     public Ausgabe() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

А класс автомобиля:

namespace Versicherungsrechner 
{ 
    public class Autos 
    { 
     public string modell { get; set; } 
     public double leistung { get; set; } 
     public double preis { get; set; } 

     public Autos(string modell, double leistung, double preis) 
     { 
      this.modell = modell; 
      this.leistung = leistung; 
      this.preis = preis; 
     } 


    } 
} 
+0

Я правильно понимаю: вы используете WPF, но вы хотите делать все без кода XAML без кода? (Ваш данный пример кода не содержит XAML, что нечетно для связанных с WPF вещей.) – elgonzo

+0

Ну, я сделал макеты окон с WPF в XAML, и им интересно делать все остальное в коде, хотя я бы хотел знаете, как это сделать в XAML. Я просто не писал материал XAML, потому что это просто макеты. – user3613744

+0

Хорошо, я вижу ... Два популярных варианта: (A) [выполнить привязку данных в кодировке] (http://msdn.microsoft.com/en-us/library/ms742863%28v=vs.110 % 29.aspx) или (B) - предпочтительный выбор, хотя и больше усилий - создать модель (ы) просмотра (VM) для ваших трех окон, которые также отражают (функциональные) отношения между этими тремя окнами (например, имеющие свойство для выбранного автомобиля) и назначить эти виртуальные машины DataContext соответствующих окон. Databind в XAML только для виртуальных машин в DataContext. Любая логика поведения реализована в виртуальных машинах, а не в самих элементах управления/окнах. – elgonzo

ответ

0

Если изменить этот класс ...

public partial class Ausgabe : Window 
{ 
    public Ausgabe() 
    { 
     InitializeComponent(); 
    } 
} 

... к этому ...

public partial class Ausgabe : Window 
{ 
    public Autos SelectedAuto {get;set} 
    public Ausgabe() 
    { 
     InitializeComponent(); 
    } 
} 

Вы можете изменить этот код ...

public void AnzeigenClick(object sender, RoutedEventArgs e) 
    { 
     Ausgabe a = new Ausgabe(); 
     a.Owner = this; 
     a.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner; 
     a.ShowDialog(); 
    } 

... к этому ...

public void AnzeigenClick(object sender, RoutedEventArgs e) 
    { 
     Ausgabe a = new Ausgabe(); 
     a.SelectedAuto = DGrid.SelectedValue as Autos; 
     a.Owner = this; 
     a.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner; 
     a.Setup(); // to do 
     a.ShowDialog(); 
    } 

И это позволит классу Aufgabe с чем работать. Вы можете повторить этот процесс с другими классами.

примечание об обязательном передовом опыте: это был подход, который люди использовали до 2006/2007 года до привязки данных, и Xaml стал популярным. В эту эпоху подход считается рискованным, поскольку он предлагает операционный риск. Но на данный момент он отвечает на ваш вопрос и позволяет вам продолжить свой проект.

+0

Спасибо, Гарри. Я не могу заставить его работать ... когда я меняю код, он все равно не распознает член DGrid из первого окна. – user3613744

+0

Такая же техника. Добавьте свойство для DataGrid во втором и третьем окнах и установите его из первого окна. Сделайте то же самое для каждого необходимого свойства. –

+0

Я все еще получаю сообщение об ошибке a.SelectedAuto = DGrid.SelectedValue as Autos; (Ссылка на объект не установлена ​​на экземпляр объекта) ... Что такое метод Setup()? В третьем окне должен был быть экземпляр автомобиля, поэтому я смогу сделать l1.Content = x.power; где l1 - метка в третьем окне, а x - это автомобиль, который я выбрал в первом. И было бы проще сделать это с помощью XAML? – user3613744

Смежные вопросы