1

プロパティを持つ Channel というクラスがあります: channelName、 (より多く、この質問には関係ありません) 、および 2 つList<double>( xValuesyValues)。

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。ファイルには 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}" />

myListOfChannelsとは次selectedChannelのように定義されます。

        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;

        }

これは他の言語からの翻訳です。構文にわずかなエラーがある可能性がありますが、機能します。お願いします、これを完全に再設計したくありません。他にも制約があります。私の質問は、冗長な割り当て(myListOfChannelsand selectedChannelforeachループなど)を削除し、作成したばかりの からデータを直接バインドできるかどうかについてです。次の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バインディング (例: {Binding Something}is equal to {Binding Path=Something}) または egで aを使用する場合は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のクラスに実装する必要があります (この場合、FileChannel、およびのようになりMainWindowます)。

于 2013-05-28T19:09:33.160 に答える