2014-01-31 3 views
0

Привет, я хотел бы узнать у вас, как передать значения. У меня есть два набора массивов: массив томов и массив кривизны. Каждый массив считывается из текстового файла, нажав кнопку в MainWindow Class, как показано ниже.Передача значения другому классу

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

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Input ip = new Input(); 

     double[] curvature = new double[40]; 
     double[] moment = new double[40]; 

     string path; 
     path = "C:\\Desktop\\48co.out"; 
     string[] records = File.ReadAllLines(path); 
     int linenumber = 0; 
     string[][] rows = new string[40][]; 

     for (int i = 0; i < records.Length; i++) 
     { 
      if (records[i] == "step epscmax in. Tens. Comp. Comp. Tens. force force rad/in (K-ft)") 
      { 
       linenumber = i + 1; 
      } 
     } 

     for (int i = linenumber; i < linenumber + 40; i++) 
     { 
      rows[i - linenumber] = records[i].Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); 
     } 

     for (int i = 0; i < 40; i++) 
     { 
      curvature[i] = Double.Parse(rows[i][9]); 
      moment[i] = Double.Parse(rows[i][10]); 
     } 

     ip.curvature = curvature; 
     ip.moment = moment; 

     PlotMPhi plotmphi = new PlotMPhi(); 
     plotmphi.Show(); 
    } 
} 

И эти два массива передаются в другой класс под названием «Вход».

class Input 
{ 
    public Input() 
    { 
     double[] curvature = new double[40]; 
     double[] moment = new double[40]; 
    } 

    public double[] curvature { get; set; } 
    public double[] moment { get; set; } 
} 

Моя идея состояла в том, чтобы сохранить все входные параметры в классе Input, и если какие-либо методы в других классах нуждаются в них, они могут быть переданы. В этом случае я хотел построить график с x точками из массива кривизны и y точек из массива моментов, используя OXYplot в WPF под названием PlotMPhi.

public partial class PlotMPhi : Window 
{ 
    public PlotMPhi() 
    { 
     var vm = new MVMMPhi(); 
     this.DataContext = vm; 
     InitializeComponent(); 
    } 
} 

class MVMMPhi 
{ 
    public Collection<MeaMPhi> MeaMPhis { get; private set; } 

    public MVMMPhi() 
    { 
     MeaMPhis = new Collection<MeaMPhi>(); 
     Input ip = new Input(); 

     for (int i = 0; i < 40; i++) 
     { 
      MeaMPhis.Add(new MeaMPhi { Curvature = ip.curvature[i],Moment = ip.moment[i]}); 
     } 
    } 
} 

public class MeaMPhi 
{ 
    public double Curvature { get; set; } 
    public double Moment { get; set; } 
} 

Это xaml-файл для построения графика.

<Window x:Class="XsectionWIN.PlotMPhi" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:oxy="clr-namespace:OxyPlot.Wpf;assembly=OxyPlot.Wpf" 
    Title="Moment-Curvature" Height="480" Width="640"> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Menu DockPanel.Dock="Top"> 
      <MenuItem Header="_File"> 
       <MenuItem Header="Save plot..." Click="SavePlot_Click"/> 
       <Separator /> 
       <MenuItem Header="_Exit" Click="exit_Click" /> 
      </MenuItem> 
     </Menu> 
     <oxy:Plot Grid.Row="1" x:Name="plot" Title="Moment-Curvature" Subtitle="{Binding Subtitle}" > 
      <oxy:Plot.Axes> 
       <oxy:LinearAxis Position="Bottom" Title="Curvature (rad/in)" TitleFont="Arial" TitleFontSize="12" TitleColor="Black"/> 
       <oxy:LinearAxis Position="Left" Title="Momennt (kips-in)" TitleFont="Arial" TitleFontSize="12" TitleColor="Black"/> 
      </oxy:Plot.Axes> 
      <oxy:Plot.Series> 
       <oxy:LineSeries Title="M-curvature" DataFieldX="Period_t" DataFieldY="Acc_t" Color="Red" StrokeThickness="3" ItemsSource="{Binding MeaMPhis}"/> 

      </oxy:Plot.Series> 
     </oxy:Plot> 
    </Grid> 
</Window> 

Проблема в том, что эти два массива не передаются классу MVMMPhi. Я проверил процедуру шаг за шагом, нажав клавишу F11. Кажется, эти массивы передаются ввод класса до достижения

PlotMPhi plotmphi = new PlotMPhi(); 
plotmphi.Show(); 

После того, как попасть в этот шаг, моменты и кривизна массивы в Inout становятся NULL. Я столкнулся с этим раньше, так что я сделал, чтобы поставить эти массивы в методе непосредственно т.е.

PlotMPhi plotmphi = new PlotMPhi(moment,curvature); 

Это работает для меня до сих пор. Но мне нужно обработать множество массивов позже, поэтому я ищу простой способ справиться и хотел бы знать, почему моя идея не работает. Я новичок в мире программирования. Я не хочу получать ложку, поэтому любые предложения или советы будут оценены. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Спасибо за ваше время и помощь,

ответ

1

Конструктор для класса DataContext можно было бы сделать, чтобы принять параметр типа ввода, так что вы бы изменить код таким образом

public MVMMPhi(Input data) 
{ 
    MeaMPhis = new Collection<MeaMPhi>(); 

    for (int i = 0; i < 40; i++) 
    { 

      MeaMPhis.Add(new MeaMPhi 
           { 
            Curvature = data.curvature[i], 
            Moment = data.moment[i] 
           }); 

    } 
} 

Это не может решить все ваши проблемы, но это может сделать мысли немного более прямым.

+0

Я устал от этого и до сих пор не указан. Есть идеи? Спасибо, – user3170073

+0

Какая часть нулевой? Вы должны убедиться, что используемый вход - это тот же самый объект (не такой же тип), который был инициализирован данными. Я также изменил бы ту часть, где вы строите PlotMPhi. –

+0

Я понял. Спасибо, – user3170073

1

в вашем коде, вы запутались между 2 "ip" Экземпляры класса Input. массивы моментов и кривизны в Input не становятся NULL. Случается, что в Button_click есть два разных объекта, называемых ip: 1 (который будет уничтожен после завершения этого события), а другой ip, который создается, когда Window «PlotMPhi» создает экземпляр класса MVMMPhi, который сам создает две вещи : коллекция MeaMPhis, которая будет содержать много пар данных «MeaMPhi» и новый «ip» экземпляр ввода, который содержит 2 пустых массива. Тогда ваше обходное решение было (громоздким) передачей 2 массивов PlotMPhi, которые затем должны были передать их в MVMMPhi, чтобы он мог использовать их для заполнения данных внутри коллекции MeaMPhis. Затем требуется итерация через массивы и, конечно же, очень дорогостоящая.

Входящие ниже содержат 3 основных изменения: 1) Я создал исходные данные из файла непосредственно в коллекцию MeaMPhi MeaMPhis. 2) Я передаю коллекцию (т. Е. Ссылку на экземпляр MeaMPhis) в окно PlotMPhi, которое затем передает его по той же цепочке в MVMMPhi. 3) благодаря (1) + (2) классу MVMMPhi больше не нужно делать копию из кривизны [], момента [], в коллекцию MeaMPhi.Его собственный MeaMPhis - это точки непосредственно (ссылка) на эту коллекцию, которая уже была заполнена Button_click и просто передана ref в конструктор MeaMPhi.

Вот слегка модифицированный Button_Click

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Collection<MeaMPhi> MeaMPhis = new Collection<MeaMPhi>(); 

     //Input ip = new Input(); 

     //double[] curvature = new double[40]; 
     //double[] moment = new double[40]; 

     string path; 
     path = "C:\\Desktop\\48co.out"; 
     string[] records = File.ReadAllLines(path); 
     int linenumber = 0; 
     string[][] rows = new string[40][]; 


     for (int i = 0; i < records.Length; i++) 
     { 
      if (records[i] == "step epscmax in. Tens. Comp. Comp. Tens. force force rad/in (K-ft)") 
      { linenumber = i + 1; } 
     } 

     for (int i = linenumber; i < linenumber + 40; i++) 
     { 

      rows[i - linenumber] = records[i].Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); 

     } 

     for (int i = 0; i < 40; i++) 
     { 
      MeaMPhis.Add(new MeaMPhi 
      { 
       Curvature = Double.Parse(rows[i][9]), 
       Moment = Double.Parse(rows[i][10]) 
      }); 

      //curvature[i] = Double.Parse(rows[i][9]); 
      //moment[i] = Double.Parse(rows[i][10]); 
     } 
     //ip.curvature = curvature; 
     //ip.moment = moment; 

     PlotMPhi plotmphi = new PlotMPhi(MeaMPhis); 
     plotmphi.Show(); 

    } 
} 

и ниже окна и другие классы.

public partial class PlotMPhi : Window 
{ 
    public PlotMPhi(Collection<MeaMPhi> MeaMPhis)//double[] moment,double [] curvature) 
    { 
     var vm = new MVMMPhi(MeaMPhis); 
     this.DataContext = vm; 
     InitializeComponent(); 
    } 

    private void SavePlot_Click(object sender, RoutedEventArgs e) 
    { 

    } 

    private void exit_Click(object sender, RoutedEventArgs e) 
    { 

    } 
} 

class MVMMPhi 
{ 
    public Collection<MeaMPhi> MeaMPhis { get; private set; } 


    public MVMMPhi(Collection<MeaMPhi> Meamphis) 
    { 
     MeaMPhis = Meamphis; 
     //Input ip = new Input(); 
     /* 
     for (int i = 0; i < 40; i++) 
     { 

      MeaMPhis.Add(new MeaMPhi 
      { 
       Curvature = curvature[i], 
       Moment = moment[i] 
      }); 

     } 
     */ 
    } 
} 

public class MeaMPhi 
{ 
    public double Curvature { get; set; } 
    public double Moment { get; set; } 

} 

Благодарим вас за полный код, который помог мне немного узнать о OxyPlot. Надеюсь, что полный рабочий код выше разъясняет мои объяснения. Основной момент здесь заключался в том, чтобы избежать ненужного копирования данных и избежать создания 2-дюймовых экземпляров ввода(). BTW, в предлагаемом решении класс Input() больше не используется.

+0

Спасибо за ваш ответ, я просто попробовал, и он работает для этого случая. Моя идея состояла в том, чтобы сохранить все входные параметры в классе, поскольку другие классы будут использовать их позже. Снова спасибо, – user3170073

+0

@ user3170073. Наконец я пришел к выводу, что не было ненужных слоев. Когда я попытался удалить один слой (включив коллекцию MeaMphis непосредственно в PlotMPhi), я не смог заставить привязку данных/datacontext работать. – Guy

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