我有一个名为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的内部对象以读取数据,根据数据将有可变数量的通道,并存储在列表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}" />
我在这里非常新手,所以如果你真的可以帮我写一篇很棒的文章。我已经阅读了几个数据绑定教程,但我无法弄清楚这一点。
顺便说一句。这可能很重要:所有这些代码都在UserControl
内。我的MainWindow.xaml
只是UserControl
的一个实例。
我已经尽力解释我想要的东西,但如果有什么不清楚的话就问问吧。谢谢。
答案 0 :(得分: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
)。