Avatar
Erik Šťastný:8. června 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. června 14:17
 
Odpovědět 8. června 14:15
Avatar
termostat
Člen
Avatar
termostat:10. června 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. června 19:03
Avatar
Odpovídá na termostat
Erik Šťastný:11. června 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. června 8:29
Avatar
Odpovídá na termostat
Erik Šťastný:12. června 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. června 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.