Zmiana koloru tła elementu w listboxie

0

Witajcie.

ListBox.Items[5] 

jest typu object. Do jakiego objektu musze to przekonwertować, aby móc zmienić tło takowego elementu?

1

Generalnie w WinFormsach trochę z tym zabawy:
http://stackoverflow.com/ques[...]rp-change-listbox-items-color

0

Nie doszukałem się odpowiednika w WPF, możecie bardziej przybliżyć?

2

Jeżeli chodzi o WPF to masz naprawdę duże pole do popisu, ponieważ interfejs w WPF jest zbudowany w oparciu o XML. Możesz sobie w takim ListBoksie zbindować kolor wiersza jaki chcesz do jakiegokolwiek wiersza. Wystarczy odpowiednio podpiąć klasę:

Przykładowe okno:
Oczywiście ListBox.ItemTemplate można tworzyć przeróżne i masz tutaj praktycznie nieskończenie wiele możliwości.

<Window x:Class="_4programmersWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_4programmersWPF"
        mc:Ignorable="d"
        Title="4prog test app" Height="370" Width="400"
        Name="Window" WindowStartupLocation="CenterScreen">
  <Window.DataContext>
    <local:Viewmodel/>
  </Window.DataContext>
  <Grid>
    <ListBox ItemsSource="{Binding Persons, UpdateSourceTrigger=PropertyChanged}">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <Grid>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="auto"/>
              <ColumnDefinition Width="auto"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
              <RowDefinition Height="auto"/>
            </Grid.RowDefinitions>
            <Label Grid.Row="0" Grid.Column="0"
                   Background="{Binding CellColor}"
                   Content="{Binding Name}"/>
            <Label Grid.Row="0" Grid.Column="1"
                   Background="{Binding CellColor}"
                   Content="{Binding Surname}"/>
          </Grid>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
  </Grid>
</Window>

Przykładowy viewmodel:

using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Input;
using System.Collections.ObjectModel;

namespace _4programmersWPF {
    class Viewmodel : INotifyPropertyChanged
    { 
        private ICollection<PersonItem> persons;
        public ICollection<PersonItem> Persons
        {
            get { return this.persons; }
            set
            {
                this.persons = value;
                this.OnPropertyChanged(nameof(this.Persons));
            }
        }

        public Viewmodel() {
            this.Persons = new ObservableCollection<PersonItem>();
            this.Persons.Add(new PersonItem
            {
                Name = "Gregory",
                Surname = "Peck",
                CellColor = "Green"
            });

            this.Persons.Add(new PersonItem
            {
                Name = "Tony",
                Surname = "Scott",
                CellColor = "Yellow"
            });

            this.Persons.Add(new PersonItem
            {
                Name = "Henry",
                Surname = "Ticket",
                CellColor = "LightBlue"
            });
        }

        // Tę część najlepiej wrzucić do osobnej klasy i po niej dziedziczyć.
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName) {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        } 
    }
}

Przykładowa klasa PersonItem, które przechowuje kolor każdego swojego obiektu:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _4programmersWPF
{
    public class PersonItem
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public string CellColor { get; set; }
    }
}

Po poskładaniu tego w projekt i skompilowaniu powinieneś uzyskać taki rezultat:

64fc70eb18.png

Oczywiście warunkiem korzystania z takiego rozwiązania, czy z WPF w ogóle, jest posiadanie podstawowej wiedzy o bindowaniu danych (czy choćby mvvm, choć to akurat nie jest konieczne).

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0