2013-05-28 2 views
1

У меня есть класс Channel, который имеет свойства: channelName, (больше, но не имеет отношения к этому вопросу) и два List<double> (, yValues).Связывание только что созданного класса

public class Channel 
    { 
     public string channelName; 
     public List<double> xValues= new List<double>(); 
     public List<double> yValues= new List<double>(); 

    } 

У меня есть класс с именем файла, есть свойства, как: fileName, ObservableCollection<Channel>listOfChannels. Файл имеет метод read(); который создает внутренние объекты класса Channel для чтения данных, в зависимости от данных будет переменное количество каналов и хранится в списках xValues и yValues данных.

public class File 
    { 
     public string fileName{ get; set; } 
     public ObservableCollection<Canal> channels{ get; set; } 
     public void read() {//stuff} 
    } 

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

<ComboBox x:Name="comboFile" 
        ItemsSource="{Binding myListOfChannels}" 
        DisplayMemberPath="channelName" 
        SelectedValuePath="channelName" 
        SelectedItem="{Binding selectedChannel}" /> 

Где myListOfChannels и selectedChannel определяются как:

 public ObservableCollection<Canal> myListOfChannels { get; set; } 
     public Canal selectedChannel { get; set; } 

Я инстанцирован их правильно в дальнейшем в коде.

Когда я нажимаю кнопку, файл загружается и создает новый объект класса File. Это мой exampleFile.

private void openButton_Click(object sender, RoutedEventArgs e) 
     { 
      File exampleFile= new File(); 
      Channel exampleChannel= new Channel(); 

      exampleFile.fileName= @"C:\Users\Path\myFile.txt"; //I haven't created OpenDialog yet 
      exampleFile.read(); 

      myListOfChannels = new ObservableCollection<Channel>(); 

      foreach (Channel mychannel in exampleFile.channels) 
      { 
       myListOfChannels .Add(mychannel); 
      } 

      selectedChannel = exampleFile.channels[0]; 
      comboFile.DataContext = this; 

     } 

Это перевод с другого языка, в синтаксисе могут быть небольшие ошибки, но он работает. Пожалуйста, мне не нужна полная редизайн, есть другие ограничения. Мой вопрос о том, если это возможно, чтобы удалить избыточное ассигнование (myListOfChannels и selectedChannel, в foreach петли, и т.д.) и непосредственно связывать данные из моих только что создал exampleFile, что-то вроде этого:

<ComboBox x:Name="comboFile" 
         ItemsSource="{Binding exampleFile.channels}" 
         DisplayMemberPath="exampleChannel.channelName" 
         SelectedValuePath="exampleChannel.channelName" 
         SelectedItem="{Binding selectedChannel}" /> 

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

BTW. Это может быть важно: весь этот код находится внутри UserControl. В моем MainWindow.xaml это всего лишь экземпляр этого UserControl.

Я попытался изо всех сил объяснить, что хочу, но если что-то неясно, просто спросите об этом. Спасибо.

ответ

1

Когда вы используете Path на переплетении (например, {Binding Something} эквивалентен {Binding Path=Something}) или, например, DisplayMemberPath, он должен ссылаться на собственность. Не поле (например, public string Something;), либо локальная переменная (например, void SomeMethod() { string something; }), но общедоступное свойство (например, public string Something { get; set; }).

В вашем коде exampleFile и exampleChannel являются, насколько я вижу, локальными переменными. Кроме того, exampleChannel не используется. Вы можете исправить это примерно так:

public File ExampleFile { get; set; } 

private void openButton_Click(object sender, RoutedEventArgs e) 
     { 
      ExampleFile = new File(); 

      ExampleFile.fileName= @"C:\Users\Path\myFile.txt"; //I haven't created OpenDialog yet 
      ExampleFile.read(); 

      myListOfChannels = new ObservableCollection<Channel>(); 

      foreach (Channel mychannel in ExampleFile.channels) 
      { 
       myListOfChannels.Add(mychannel); 
      } 

      selectedChannel = ExampleFile.channels[0]; 
      comboFile.DataContext = this; 

     } 

(как соглашение, свойства в.NET использование PascalCase, поэтому ExampleFile, не exampleFile)

Также отметим: если свойство может измениться, и вы хотите привязки автоматически обновлять, когда это произойдет, вы должны реализовать INotifyPropertyChanged на классе (ов) вы находитесь (в данном случае это выглядит как File, Channel и MainWindow).

+0

Спасибо! Я мог бы удалить этот цикл foreach и привязать непосредственно ExampleFile. Можно связать что-то с другим UserControl? Например, у меня есть myControl1 и myControl2. Можно установить флажок в 1 в зависимости от того, проверен ли другой чечбок в 2? (Немного offtopic, извините) – Sturm

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