刚刚创建的类绑定

时间:2013-05-28 18:42:38

标签: c# wpf binding

我有一个名为Channel的类,它具有属性:channelName,(更多但与此问题无关),以及两个List<double>xValuesyValues)。

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

    }

我还有一个名为File的类,有以下属性:fileNameObservableCollection<Channel> listOfChannels。 File有一个名为read()的方法;它创建了类Channel的内部对象以读取数据,根据数据将有可变数量的通道,并存储在列表xValuesyValues数据中。

 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}" />

myListOfChannelsselectedChannel定义为:

        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;

        }

这是来自其他语言的翻译,语法上可能会有轻微错误,但它有效。 拜托,我不想完全重新设计,还有其他限制。 我的问题是,是否可以删除冗余分配(myListOfChannelsselectedChannelforeach循环等)并直接绑定刚刚创建的exampleFile中的数据,像这样的东西:

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

我在这里非常新手,所以如果你真的可以帮我写一篇很棒的文章。我已经阅读了几个数据绑定教程,但我无法弄清楚这一点。

顺便说一句。这可能很重要:所有这些代码都在UserControl内。我的MainWindow.xaml只是UserControl的一个实例。

我已经尽力解释我想要的东西,但如果有什么不清楚的话就问问吧。谢谢。

1 个答案:

答案 0 :(得分:1)

在绑定上使用Path时(例如{Binding Something}相当于{Binding Path=Something})或者DisplayMemberPath,它必须引用一个属性。不是字段(例如public string Something;)或本地变量(例如void SomeMethod() { string something; }),而是公共属性(例如public string Something { get; set; })。

在您的代码中,exampleFileexampleChannel就我所见而言是局部变量。此外,似乎没有使用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(在这种情况下,看起来像FileChannelMainWindow)。