0

今まで、私はリストビューにアイテムを追加しました

lstView.Items.Add(new MyData("Val", 1));

問題は、アイテムのスタイル (背景など) を items[i].Background だけで変更できないことです。

MyData に ListViewItem を継承させようとしましたが、バインディングが機能しません。

私のバインディング:

<GridViewColumn Header="my var" DisplayMemberBinding="{Binding Path=Name}" />

私が言ったように、アイテムを自分のクラスとして追加すると機能しますが、クラスがlistviewitemを継承すると機能しません。また、クラスの DataContext を使用して listviewitem を追加しようとしましたが、うまくいきませんでした。

誰でもこれを修正する方法を知っていますか?

4

2 に答える 2

2

WPF には、視覚化を基になるデータから分離するためのデータ テンプレートの概念があります。ListView (他の ItemsControl と同様) は、ItemTemplateプロパティを使用して項目のデータ テンプレートを提供します。これについては、ItemsControl のスタイリングとテンプレート化で読むことができます。

この単純な DataItem クラスを考えると

public class DataItem
{
    public string ItemText { get; set; }
    public Brush ItemBackground { get; set; }
}

そのクラスの非常に単純な DataTemplate には、Border と TextBlock コントロールのみが含まれる場合があります。

<ListView Name="listView">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Border Background="{Binding ItemBackground}">
                <TextBlock Margin="4" Text="{Binding ItemText}"/>
            </Border>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

GridView を含む ListViewでは、次CellTemplateの代わりに GridViewColumn を指定しItemTemplateます。

<ListView Name="listView">
    <ListView.View>
        <GridView>
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Border Background="{Binding ItemBackground}">
                            <TextBlock Margin="4" Text="{Binding ItemText}"/>
                        </Border>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

これで、次のように DataItems を ListView に簡単に追加できます。

listView.Items.Add(new DataItem { ItemText = "Item 1", ItemBackground = Brushes.AliceBlue });
listView.Items.Add(new DataItem { ItemText = "Item 2", ItemBackground = Brushes.LemonChiffon });
listView.Items.Add(new DataItem { ItemText = "Item 3", ItemBackground = Brushes.LightCoral });

UI が DataItem オブジェクトの変更に反応するようにするには、DataItem クラスにINotifyPropertyChangedを実装する必要があります。

public class DataItem : INotifyPropertyChanged
{
    ...
}

Itemsデータと UI をより適切に分離するには、項目をListViewのコレクションに直接追加するのではなくItemsSource、プロパティを type のプロパティにバインドしObservableCollection<DataItem>ます。

<ListView ItemsSource="{Binding DataItems}">
    ...
</ListView>

このトピックの詳細については、データ バインディングの概要/コレクションへのバインディングを参照してください。

于 2013-03-17T17:45:15.640 に答える
0

データバインディングを使用し、アイテムごとに BackColor などのプロパティをアイテムに関連付け、アイテムを (ObservableCollection に) バインドします。色を変更する場合は、item.BackColor=... を呼び出すだけで済みます。 !

于 2013-03-17T14:15:09.600 に答える