0

私はこの問題を自分で解決するのに失敗して数日を過ごしました。そのため、xamlとコードビハインドについて非常に基本的なことを理解していないと思います。WPFとc#を使用して、ObservableCollectionのデータをListViewに表示しようとしています。

デバッグを開始すると、ウィンドウにグリッドとヘッダーを含むリストビューが表示されます。そこにあるはずのアイテムの数に相当するクリック可能な行がありますが、アイテムは空白または空で表示されます。私はこれを介して私の方法を学ぶために不完全なチュートリアルに取り組んでいました、コードは次のとおりです:

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();           
    }   
}

NameList.cs:

class NameList : ObservableCollection<PersonName>
{
    public NameList()
        : base()
    {
        Add(new PersonName("Willa", "Cather")); //enumerated? (firstName, lastName)
        Add(new PersonName("Isak", "Dinesen"));
        Add(new PersonName("Victor", "Hugo"));
        Add(new PersonName("Jules", "Verne"));
    }
}

PersonName.cs:

class PersonName
{
    private string firstname;
    private string lastname;

    public PersonName(string first, string last)
    {
        this.firstname = first;
        this.lastname = last;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

xamlを含めますが、ここでの質問でそれを行う方法がわからないので、できる限り詳しく説明します。

ListView ItemsSource=""{Binding Source={StaticResource NameListData}}"

GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}"

GridViewColumn DisplayMemberBinding="{Binding Path=LastName}"

実際のバインディングのみをリストしました。レイアウト情報がそれほど重要であるとは思いませんでしたが、その仮定が間違っている場合はお知らせください。

4

3 に答える 3

5

プライベートフィールドに値を割り当てます

this.firstname

しかし、プロパティにバインドします

public string FirstName { get; set; }

これはうまくいくはずです

public PersonName(string first, string last)
{
    this.Firstname = first;
    this.Lastname = last;
}
于 2013-02-08T20:35:29.313 に答える
2

メインウィンドウには、バインドできるようにデータを含むプロパティが必要です

public partial class MainWindow : Window
{
    private NameList _nameList;

    public NameList NameList
    {
        get { return _nameList; }
        set
        {
            if (_nameList != value)
            {
                _nameList = value;
            }
         }
    }

    public MainWindow ()
    {
        InitializeComponent(); 

        NameList = new NameList();
    }
}

PersonNameクラスは、プロパティ(メンバーではなく)を割り当てて、それらにバインドできるようにする必要があります。

public class PersonName
{
    public PersonName(string first, string last)
    {
        FirstName = first;
        LastName = last;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

XAMLでは、次のようにバインドできます。

<ListView ItemsSource="{Binding NameList}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <Run Text="{Binding LastName}" /><Run Text=", " /><Run Text="{Binding FirstName}" />
            </TextBlock>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

したがって、結果は次のようになります。

ここに画像の説明を入力してください

于 2013-02-08T20:44:29.107 に答える
0

だから私はちょうどそれを理解しました.@LPLによって引き起こされた一瞬の理解です。

プロパティを宣言したとき、get 値と set 値をプライベート文字列に設定しなかったため、バインディングがそれらを呼び出したときに、4 つの項目が存在することがわかりましたが、それらは空の項目でした。現在機能するコードは次のようになります。

 public string FirstName
    {
        get {return firstname; }
        set{ firstname=value; }
    }

LastName の同等のプロパティを使用します。単純な問題が大きな頭痛の種になる喜び。

于 2013-02-08T20:54:08.670 に答える