Klávesnice zdarma Klávesnice zdarma
Pořádné programy s pořádnou klávesnicí zdarma. Více zde
Pouze tento týden sleva až 80 % na C# .NET
Avatar
Erik Šťastný:8.6.2018 14:15

Zdravíčko,

Mám list, který obsahuje prvky této třídy:

public class Record
{
    public int employeeId { get; set; }
    public int hours { get; set; }

    public Record(int employeeId, int hours)
    {
        this.employeeId = employeeId;
        this.hours = hours;
    }
}

Jednotlivé záznamy jsou v listu, nicméně jak vidíte jsou zde uloženy pouzé ID odkazující na záznam. Rád bych tyto záznamy ukázal v DataGridu, nicméně ne jejich ID, ale reálnou hodnotu toho ID.

Zkusil jsem: Napadlo mě následující řešení:

Třídu Record obohatit o další string proměnnou a nebindovat původní ID, ale nabindovat novou proměnnou, které v getu vyberou odněkud reálnout hodnotu. Dává to řešení smysl?

public class Record
{
    public int employeeId { get; set; }
    public int hours { get; set; }

    pubic string employee
    {
            get
            {
                    return // Translator.getRealName(employeeId)
            }
    }

    public Record(int employeeId, int hours)
    {
        this.employeeId = employeeId;
        this.hours = hours;
    }
}

Chci docílit: Má otázka je, zda existuje nějaké rozumnější nebo elegantnější řešení, jak například navázat bind přímo na nějakou metodu na místo proměnné nebo něco, díky moc :)

Editováno 8.6.2018 14:17
 
Odpovědět 8.6.2018 14:15
Avatar
termostat
Člen
Avatar
termostat:10.6.2018 19:03

Záleží jestli ten sloupec se jménem zaměstnance v DataGridu chceš mít jen ke čtení, nebo bude editovatelný.
Pokud jen ke čtení, tak stačí použít Converter:

public sealed class EmployeeIdToNameConverter : IValueConverter
{
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
                var employeeId = (int)value;
                return Translator.getRealName(employeeId);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
                throw new NotImplementedException();
        }
}

Potom v okně to může vypadat nějak takto:

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                                xmlns:local ="clr-namespace:WpfApplication3">
        <Window.Resources>
                <local:EmployeeIdToNameConverter x:Key="employeeIdToNameConverter"/>
        </Window.Resources>
        <Grid>
                <DataGrid x:Name="dataGrid" AutoGenerateColumns="False">
                        <DataGrid.Columns>
                                <DataGridTextColumn Binding="{Binding employeeId, Converter={StaticResource employeeIdToNameConverter}}" IsReadOnly="True"/>
                                <DataGridTextColumn Binding="{Binding hours}"/>
                        </DataGrid.Columns>
                </DataGrid>
        </Grid>
</Window>

Místo "WpfApplication3" si samozřejmě dáš svůj namespace.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 10.6.2018 19:03
Avatar
Odpovídá na termostat
Erik Šťastný:11.6.2018 8:29

To vypadá skvěle, přesně nějakou takovou věc jako přidání nějaké vlastní logiky k bindování jsem hledal. Otestuju jakmile se k tomu dostanu :)

 
Nahoru Odpovědět 11.6.2018 8:29
Avatar
Odpovídá na termostat
Erik Šťastný:12.6.2018 9:15

Jo tak funguje to skvěle, s WPF začínám, takže moc netuším k čemu vlastně a jak se používají ty resources v xaml, ale funguje to no :)

 
Nahoru Odpovědět 12.6.2018 9:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.