1

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

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

    }

我还有一个名为 File 的类,其属性为:fileName, ObservableCollection<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; }

我稍后在代码中正确地实例化了它们。

当我单击一个按钮时,文件会加载并创建一个新的 class 对象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

我已尽力解释我想要什么,但如果有不清楚的地方,就问它。谢谢你。

4

1 回答 1

1

当您Path在绑定上使用 a (例如{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)。

于 2013-05-28T19:09:33.160 回答