Potrzebuje zrobić kontrolkę ktora wyswietli porownanie obiektow jako matryca na ktorej widać roznice pomiedzy obiektami. W pierwszej kolumnie ListView maja byc jakies skladniki unikatowe wystepujace w roznych konfiguracjach w roznych obiektach zlozonych a w kolejnych kolumnach ListView maja byc dodawane dynamiecznie porownywane obiekty. Naglowkiem tych kolumn maja byc nazwy porownywanych obiektow zlozonych a wartosciami znaczek 'x' symbolizujacy czy dany skladnik z pierwszej kolumny wystepuje w tym obiekcie zlozonym czy nie. To co do tej pory zrobiłem, oparłem o słownik, tzn. ListView wyswietla kolekcje obiektow "LiniaPorownania" w takim obiekcie porownania zawsze wystepuje wlasciwosc Typu Dictionary<string,bool> ktorej klucz 'string' chcialbym zeby byl naglowkiem kolejnych kolumn ListView a wartosc znacznikiem 'x' na matrycy oznaczajacym czy dany skladnik jest zawarty w skladzie oiektu zlozoego czy nie.
Poniżej przykład abstrakcyjny ale ma wszystkie elementy ktore chcialbym miec w docelowym rozwiazaniu.
mój Model
public class Kolor
{
public string Nazwa { get; }
public int Nasycenie { get; private set; }
public Kolor(string nazwa, int nasycenie)
{
this.Nazwa = nazwa;
this.Nasycenie = nasycenie;
}
public void ZmienNasycenie(int noweNasycenie)
{
Nasycenie = noweNasycenie;
}
public override string ToString()
{
return $"Kolor:{Nasycenie.ToString().PadLeft(4, ' ')} - '{Nazwa}'";
}
}
public class ZmieszanaFarba
{
public string NazwaMieszaniny { get; }
public List<Kolor> Skladniki { get; }
public ZmieszanaFarba(string nazwa)
{
Skladniki = new List<Kolor>();
this.NazwaMieszaniny= nazwa;
}
public ZmieszanaFarba DodajSkladnik(Kolor kolor)
{
bool czyDodany = false;
foreach (var item in Skladniki)
{
if (item.Nazwa == kolor.Nazwa )
{
item.ZmienNasycenie(item.Nasycenie + kolor.Nasycenie);
czyDodany = true;
}
}
if (!czyDodany)
Skladniki.Add(kolor);
return this;
}
}
public class LiniaPorownania
{
public Kolor SkladnikKolor { get; private set; }
public Dictionary<string, bool> Matryca;
public LiniaPorownania(Kolor kolor)
{
Matryca = new Dictionary<string, bool>();
this.SkladnikKolor = kolor;
}
public void DodajDoMatrycy(ZmieszanaFarba mieszanina)
{
string nazwaMieszaniny = mieszanina.NazwaMieszaniny;
bool czyZawieraTenSkladnik = mieszanina.Skladniki.Any(o => (o.Nazwa == SkladnikKolor.Nazwa &&
o.Nasycenie == SkladnikKolor.Nasycenie));
Matryca.Add(nazwaMieszaniny, czyZawieraTenSkladnik);
}
}
mój ViewModel
public class ViewModel : INotifyPropertyChanged
{
private ObservableCollection<ZmieszanaFarba> mieszaniny;
public ObservableCollection<ZmieszanaFarba> Mieszaniny { get { return mieszaniny; } }
public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged(string nazwa)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(nazwa));
}
private ZmieszanaFarba zaznaczonaFarba;
public ZmieszanaFarba ZaznaczonaFarba {
get { return zaznaczonaFarba; }
set { zaznaczonaFarba = value;
OnPropertyChanged(nameof(ZaznaczonaFarba)); } }
private ObservableCollection<LiniaPorownania> matrycaPorownan;
public ObservableCollection<LiniaPorownania> MatrycaPorownan { get { return matrycaPorownan; } }
public ViewModel()
{
Kolor zoltyA = new Kolor("ŻółtyA", 110);
Kolor zoltyB = new Kolor("ŻółtyB", 175);
Kolor niebieskiA = new Kolor("NiebieskiA", 77);
Kolor niebieskiB = new Kolor("NiebieskiB", 135);
Kolor czerwonyA = new Kolor("CzerwonyA", 95);
Kolor czerwonyB = new Kolor("CzerwonyB", 225);
Kolor bialyA = new Kolor("BiałyA", 200);
ZmieszanaFarba zielonyA = new ZmieszanaFarba("ZielonyJasny")
.DodajSkladnik(zoltyA)
.DodajSkladnik(niebieskiA);
ZmieszanaFarba zielonyB = new ZmieszanaFarba("ZielonyCiemny")
.DodajSkladnik(zoltyB)
.DodajSkladnik(niebieskiB);
ZmieszanaFarba pomaranczA = new ZmieszanaFarba("PomaranczJasny")
.DodajSkladnik(zoltyA)
.DodajSkladnik(czerwonyB)
.DodajSkladnik(bialyA);
ZmieszanaFarba pomaranczB = new ZmieszanaFarba("PomaranczCiemny")
.DodajSkladnik(zoltyB)
.DodajSkladnik(czerwonyB);
ZmieszanaFarba fiolet = new ZmieszanaFarba("Fioler")
.DodajSkladnik(czerwonyA)
.DodajSkladnik(niebieskiB);
mieszaniny = new ObservableCollection<ZmieszanaFarba>() { zielonyA, zielonyB, pomaranczA, pomaranczB, fiolet };
ZaznaczonaFarba = zielonyA;
List<Kolor> unikalneKolory = new List<Kolor>();
foreach (var item in mieszaniny)
foreach (var item2 in item.Skladniki)
if (!unikalneKolory.Contains(item2))
unikalneKolory.Add(item2);
unikalneKolory = unikalneKolory.OrderBy(o => o.Nazwa).ThenBy(o => o.Nasycenie).ToList();
matrycaPorownan = new ObservableCollection<LiniaPorownania>();
foreach (var kolor in unikalneKolory)
{
LiniaPorownania linia = new LiniaPorownania(kolor);
foreach (var mieszanina in mieszaniny)
linia.DodajDoMatrycy(mieszanina);
matrycaPorownan.Add(linia);
}
}
}
i widok
<Window x:Class="WPF_multi_próby.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:WPF_multi_próby"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="150"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Name="ListaMieszanin"
Grid.Row="0" Grid.Column="0" Orientation="Vertical">
<TextBlock Text="Lista mieszanin:"/>
<ListView ItemsSource="{Binding Mieszaniny}" SelectedItem="{Binding ZaznaczonaFarba}" Margin="10">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Nazwa mieszaniny: "/>
<TextBlock Text="{Binding NazwaMieszaniny}" Width="120" FontWeight="Bold"/>
<TextBlock Text="Składników: " Margin="0,0,10,0"/>
<TextBlock Text="{Binding Skladniki.Count}" FontWeight="Bold"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
<StackPanel Name="SkladZaznaczonejMieszaniny"
Grid.Column="1" Grid.Row="0">
<TextBlock Text="sklad zaznaczonej mieszaniny"/>
<ListView ItemsSource="{Binding ZaznaczonaFarba.Skladniki}" Margin="10">
<ListView.View>
<GridView>
<GridViewColumn Header="Nazwa farby" DisplayMemberBinding="{Binding Nazwa}" Width="100"/>
<GridViewColumn Header="Nasycenie barwy" DisplayMemberBinding="{Binding Nasycenie}" Width="100"/>
</GridView>
</ListView.View>
</ListView>
</StackPanel>
<StackPanel Name="MultiporownywarkaMieszanin"
Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" Orientation="Vertical">
<TextBlock Text="Multiporownywarka mieszanin"/>
<ListView ItemsSource="{Binding MatrycaPorownan}" Margin="10" FontFamily="Cascadia Code" >
<ListView.View>
<GridView>
<GridViewColumn Header="Unikalny składnik" DisplayMemberBinding="{Binding SkladnikKolor}" Width="180"/>
<!-- nie wiem jak tu zrobic te dynamiczne kolumny -->
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</Grid>
</Window>