Kolor wiersza DataGrid w zależności od danych

0

Hej,
Chcialabym aby wiersz w DataGrid byl pokolorowany na rozowo lub niebiesko w zaleznosci od plci. Robilam to wedlug pewnego tutoriala ale nie zadzialalo :

Plik z templatem :

 public class Row_Templates : DataTemplateSelector
    {
       public DataTemplate FemmeTemp { get; set; }
       public DataTemplate HommeTemp { get; set; }
    

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
            var Membre = item as ArbreGen;
           
            if (Membre == null)
            return base.SelectTemplate(item, container);

        if (Membre.SexS == 'M')
        {
            return HommeTemp;
        }
        return FemmeTemp;
    }
  }

Plik XAML

<Window.Resources>
  <local:Row_Templates x:Key="SexTemplate">
    <local:Row_Templates.FemmeTemp>
      <DataTemplate>
        <Grid Background="Pink">
        </Grid>
      </DataTemplate>
    </local:Row_Templates.FemmeTemp>
  <local:Row_Templates.HommeTemp>
    <DataTemplate>
      <Grid Background="Red">
      </Grid>
    </DataTemplate>
  </local:Row_Templates.HommeTemp>
</local:Row_Templates>
        
</Window.Resources>
    
<DataGrid x:Name="dataGrid" AutoGenerateColumns="False" FontSize="13.333" IsReadOnly="True" ItemsSource="{Binding}" RowDetailsTemplateSelector="{StaticResource SexTemplate}" >
  <DataGrid.Columns>
    <DataGridTextColumn x:Name="id" Header="ID" Width="*"  CanUserResize="False" Binding="{Binding Path=IDS }"/>
    <DataGridTextColumn x:Name="nom" Header="Imie" Width="4*" CanUserResize="False" Binding="{Binding Path=PrenomS }"/>
    <DataGridTextColumn x:Name="prenom" Header="Nazwisko" Width="4*" CanUserResize="False" Binding="{Binding Path=NomS }"/>
  </DataGrid.Columns>
</DataGrid>

Pomozcie prosze

0

@Vanilka Nie miałam do czynienia z takim problemem, ale zauważ że FemmeTemp masz różowy a w HommeTemp czerwony. Proponuję zmienić w HommeTemp na niebieski. Jeśli problem nie polega na złym kolorze, prosiłabym o udostępnienie tego tutoriala, łatwiej będzie mi Tobie pomóc :).

0

problem polega na tym ze sie w ogóle nie koloruje :D

Takz eten kod w ogóle nie zadzialal :)
Uzylam tego :

http://blogs.developpeur.org/tom/archive/2007/07/30/wpf-comment-changer-le-template-d-un-contr-le-en-fonction-de-ses-donn-es.aspx

Wydaje mi sie ze problem jest taki ze on nie rozpoznaje Elementu.. czyli

Membre = item as ArbreGen 

Jezszcze implementacja Bindowania danych :

static ObservableCollection <ArbreGen> lista; 
        public MainWindow()
        {
            InitializeComponent();
            lista = new ObservableCollection<ArbreGen>();
            dataGrid.DataContext = lista;
            
        }
           
        int ids = 0;
        private void AjoutSim_Click(object sender, RoutedEventArgs e)
        {
        
            if (Ajout.Content == "Acepte")
            {
                char choix_sex = 'M';
                if (SexF.IsChecked == true)
                    choix_sex = 'F';
                else if (SexM.IsChecked == true)
                    choix_sex = 'M';

                           
                if (MireNom.Text != "" && MirePrenom.Text != "")
                {
                    ArbreGen SIMEK = new ArbreGen(ids++, MirePrenom.Text, MireNom.Text, choix_sex );
                    lista.Add(SIMEK);
                    AjoutSImFenetre.Visibility = Visibility.Collapsed;
                    Base.Visibility = Visibility.Visible;
                    Ajout.Content = "Dodaj Sima";
                    reset();
                    label4.Content = choix_sex.ToString();
                } 

            } else if (Ajout.Content != "Acepte")
            {
                AjoutSImFenetre.Visibility = Visibility.Visible;
                Base.Visibility = Visibility.Collapsed;
                Ajout.Content = "Acepte";

            }
         
        } 

Taki maly edit :
Zmieniajac w XAML znacnziki na DataGrid i potem RowBacground udalo mi sie ustalic, ze program dobrze rozpoznaje obiekty. Tzn, jak klikne na obiekt, to rozwija sie pasek ( jest na kilka pixeli) ktory rzeczywiscie ma rzadane kolory.. ale to nie to co chcialam uzyskac.

Ja chcialam aby po dodaniu nowej osoby, linia odpowiadajaca za ten rekord byla pokolorowana... i to nie dziala. Czyli wychodzi na to, ze zle parametry dalam, tylko ze jak patrzylam, to w porandikach dotyczacych tego tematu bylo wlasnie w ten sposob, i tam to dzialalo. Jedyna roznica do dane byly wstepnie dorzucone do programu, a moje dorzucam w trakcie jego dzialania. NIemniej jednak to i tak dziwne dla mine, ze im sie kolorowaly cale rekordy, a u mnie dopiero po kliknieciu na niego koloruje sie pasek, pojawiajacy sie w momencie klikniecia ( takie jakby rozszerzenie tego rekordu)

1

Zastosuj właściwość DataGrid:

          <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
              <Setter Property="BorderBrush" Value="{Binding Kolor}"/>
              <Setter Property="Background" Value="{Binding Kolor}"/>
            </Style>
          </DataGrid.CellStyle>

Zbinduj zmienną Kolor do stringa i zmieniaj kolor w zależności od zwartości komórek.

Trochę za bardzo przekombinowujesz kod.

1

To tak:

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False" FontSize="13.333" IsReadOnly="True" ItemsSource="{Binding}" RowDetailsTemplateSelector="{StaticResource SexTemplate}" >
	<DataGrid.CellStyle>
		<Style TargetType="DataGridCell">
			<Setter Property="BorderBrush" Value="{Binding Kolor}"/>
			<Setter Property="Background" Value="{Binding Kolor}"/>
		</Style>
	</DataGrid.CellStyle>
	<DataGrid.Columns>
		<DataGridTextColumn x:Name="id" Header="ID" Width="*"  CanUserResize="False" Binding="{Binding Path=IDS }"/>
		<DataGridTextColumn x:Name="nom" Header="Imie" Width="4*" CanUserResize="False" Binding="{Binding Path=PrenomS }"/>
		<DataGridTextColumn x:Name="prenom" Header="Nazwisko" Width="4*" CanUserResize="False" Binding="{Binding Path=NomS }"/>
	</DataGrid.Columns>
</DataGrid>

Widzę, że piszesz w Code Behind, a nie w MVVM więc w CB utwórz publiczną właściwość string Kolor:

...

private string _kolor;
public string Kolor{
	get { return this._kolor; }
	set { this._kolor = value; }
}

...

Teraz manipuluj zmienną Kolor przy ładowaniu danych do grida w konstruktorze i masz co chciałaś.

BTW: Nie musisz pisać Path w bindingu. To jest dodawane niejawnie. Po drugie: jeżeli będziesz chciała zmieniać kolory już po załadowaniu wszystkiego do grida to poczytaj sobie o czym takim jak interfejs INotifyPropertyChanged, bo inaczej zmiany się nie rozpropagują.

0

no zaczelo cos mi juz switac :)
Bede probowac dalej :) dziekuje ;)

EEdit :

Jednak mi sie nie udalo :(

                <DataGrid x:Name="dataGrid" AutoGenerateColumns="False" FontSize="13.333" IsReadOnly="True" ItemsSource="{Binding}">
                    <Style TargetType="DataGrid">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=SexS}" Value="F">
                                <Setter Property="Background" Value="Blue" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
1

Dobra, zrób tak:

Zrób sobie w DataGridzie taką rzecz z kolumnami, że zamiast kolumny tekstowej zrób sobie własny template:

              <DataGridTemplateColumn Header="Płeć" Width="auto">
                <DataGridTemplateColumn.CellTemplate>
                  <DataTemplate>
                    <Grid Background="{Binding Kolor}">
                      <Label FontSize="12" Margin="3"
                             HorizontalAlignment="Center"
                             VerticalAlignment="Center"
                             Content="{Binding Plec}"/>
                    </Grid>
                  </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
              </DataGridTemplateColumn>

To co napisałem nie jest jakoś trudne. Popatrz... Formatka danych, w tym wypadku Label znajduje się w Gridzie, któremu nadajemy tło. Teraz musisz utworzyć klasę elementów typu ObservableCollection<T>. W Klasie T musisz umieścić zmienną Kolor gdyż każdy wiersz będzie miał kolor w zależności od płci. Taka klasa może wyglądać np. tak:

class Wiersz{
	public string Kolor { get; set; }
	public string Plec{ get; set; }
}

Teraz podczas wypełniania DataGridu danymi wstawiasz warunek, że zmienna Kolor ma być taka, a taka w zależności od zmiennej Plec. Możesz to zrobić w konstruktorze np w ten sposób:


//	this.Tabela to obiekt typu ObservableCollection<Wiersz> zbindowany jako źródło danych DataGridu
this.Tabela.Add(new Wiersz{ Plec = "Kobieta" });

if(this.Tabela[this.Tabela.Count - 1].Plec == "Kobieta")
	this.Tabela[this.Tabela.Count - 1].Kolor = "#3d3d3d";
else this.Tabela[this.Tabela.Count - 1].Kolor = "#444444";

I gotowe.

PS: Jeżeli zastosujesz taki template względem każdej komórki w wierszu to otrzymasz oczekiwany efekt.

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