tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
1310
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    {Eve} {Eve} ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    54
    Hallo,

    ich arbeite mich gerade in WPF ein und stehe vor dem ersten grossen Problem wo ich nicht weiß wie ich es genau angehen muss bzw. wo mein Fehler ist.

    Ich habe eine ListView welche mit ListViewItems dynamisch über C# gefüllt werden soll. Allerdings sind es nicht einfache ListViewItems sondern eine eigene Klasse welche von ListViewItem abgeleitet ist.

    Nun habe ich mir noch ein ResourceDictionary zugelegt in welchem ich ein Template für das abgeleitete ListViewItem erstellt habe.
    Das ListViewItem soll so aussehen das vorne ein Bild ist und dahinter ein Text.
    (Das ResourceDictionary ist in der App.xaml in <Application.Resources> eingebunden)

    Mein Problem:
    Wie schaffe ich es ein Databinding zu erstellen, welches mir die zwei Variablen, für das Bild und den Text, aus der abgeleiteten Klasse in die Ansicht überträgt.

    Der Code sieht folgendermaßen aus:

    Das ResourceDictionary:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    
    <ResourceDictionary 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:priui="clr-namespace:PrimeUI">
     
        <Style x:Key="PriListViewItemStyle" TargetType="{x:Type priui:PriListViewItem}">
     
            <Setter Property="FontSize" Value="22"></Setter>
            <Setter Property="Foreground" Value="Blue"></Setter>
            <Setter Property="FontFamily" Value="Verdana"></Setter>
            
            <Setter Property="Template">
                <Setter.Value>
     
                    <ControlTemplate TargetType="{x:Type priui:PriListViewItem}">
                        <Border SnapsToDevicePixels="True">
                            <Grid x:Name="MainGrid">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
     
                                <Image x:Name="imJob" Grid.Column="0" Grid.Row="0" Width="Auto"/>
     
                                <TextBlock Text="{TemplateBinding Content}" Width="Auto" Grid.Row="0" Grid.Column="1" x:Name="PriListViewItemContent">
                                </TextBlock>
                            </Grid>
                        </Border>
     
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter TargetName="MainGrid" Property="Background" Value="LightBlue"/>
                            </Trigger>
                            <Trigger Property="IsSelected" Value="False">
                                <Setter TargetName="MainGrid" Property="Background" Value="Green"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="MainGrid" Property="Background" Value="Orange"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter TargetName="MainGrid" Property="Background" Value="LightGray" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
     
                </Setter.Value>
            </Setter>
     
        </Style>
     
    </ResourceDictionary>


    Die abgeleitete Klasse:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    namespace PrimeUI
    {
        public class PriListViewItem : ListViewItem
        {
            protected Image m_imIcon = new Image();
            protected String m_strDisplayText = "";
            
            public PriListViewItem()
            { }
     
            public String DisplayText
            {
                get 
                {
                    return (String)Content;
                }
                set
                {
                    Content = value;
                }
            }
        }
    }


    Ich habe es soweit geschaft das ich über
    Code :
    1
    
    <TextBlock Text="{TemplateBinding Content}" Width="Auto" ...


    schonmal den Text darstellen kann. Allerdings auch nur weil ich mit
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public String DisplayText
            {
                get 
                {
                    return (String)Content;
                }
                set
                {
                    Content = value;
                }
            }

    auf das vererbte Attribut Content zugreife.

    Ich möchte nun die Variablen
    Code :
    1
    2
    
    protected Image m_imIcon = new Image();
    protected String m_strDisplayText = "";

    in meinem Template darstellen.

    Ich habe schon verschiedene Sachen ausprobiert aber der Text wird mir dann einfach nicht angezeigt. Das Problem ist das ich nicht genau weiß wie ich dieses Databinding in dem template syntaktisch schreiben muss das es das macht was ich möchte xD.
    (Setter/Getter muss ich natürlich auf m_strDisplayText umstellen)

    Weiß jemand wie das geht und kann mir einen Ratschlag geben?
    Bin für jeden Tip dankbar

    Gruss

    Edit:
    Das template wird über
    Style cStyle = (Style)FindResource("PriListViewItemStyle");
    dem dynamisch erstellten Objekt zugeteilt
    Geändert von {Eve} (10.02.10 um 08:08 Uhr)
     
    {Eve}

  2. #2
    {Eve} {Eve} ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    54
    Hallo da bin ich wieder ,

    schließlich mußte ich feststellen das ich mich da in eine Richtung zu fest verbissen hatte und es unbedingt auf diese Weise lösen wollte.

    Ich dachte ich kann nur ein DataTemplate oder ein ControlTemplate haben...
    Schließlich habe ich es mt Hilfe von:
    http://www.beacosta.com/blog/?p=40
    lösen können. (SourceCode ist dort auch vorhanden)

    Das Bild wird allerdings noch nicht angezeigt, aber das sollte ich auch noch hinbekommen wenn ich es mit der Uri mache.
    Allerdings frage ich mich noch ob es nur mit der Uri geht, kann ich denn nicht z.B. das Bild direkt da reinstecken.
    Kann doch sein dass das Bild aus einer DB kommt und ich gar keine Uri habe.
     
    {Eve}

  3. #3
    {Eve} {Eve} ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    54
    Hallo,

    also irgendwie funktioniert das immer noch nicht so wie ich mir das vorstelle.

    Ich hab das ganze jetzt mal auf ein kleines Beispiel reduziert:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    namespace testapp
    {
        class ListViewItemCustom : ListViewItem
        {
            protected String m_strDisplayText = "";
     
            public String DisplayText
            {
                get
                {
                    return (String)m_strDisplayText;//m_strDisplayText Content
                }
                set
                {
                    m_strDisplayText = value;
                }
            }
        }
    }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    
    <Window x:Class="testapp.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:testapp"
        Title="Window1" Height="300" Width="300">
        
        <Window.Resources>
     
            <DataTemplate x:Key="ListViewItemDataTemplate" DataType="{x:Type local:ListViewItemCustom}">
                <Border SnapsToDevicePixels="True">
                    <StackPanel>    
                        <TextBlock Text="{Binding DisplayText}">
                        </TextBlock>
                    </StackPanel>
                </Border>
            </DataTemplate>
            
            <Style x:Key="PriListViewItemStyle" TargetType="{x:Type local:ListViewItemCustom}">
                <Setter Property="FontSize" Value="22"></Setter>
                <Setter Property="Foreground" Value="Blue"></Setter>
                <Setter Property="FontFamily" Value="Verdana"></Setter>
                
                <Setter Property="Template">
                    <Setter.Value>
     
                        <ControlTemplate TargetType="{x:Type local:ListViewItemCustom}">
                            <Border SnapsToDevicePixels="True">
                                <StackPanel x:Name="MainPanel">                      
                                    <ContentPresenter ContentTemplate="{StaticResource ListViewItemDataTemplate}"></ContentPresenter>
                                </StackPanel>
                            </Border>
     
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter TargetName="MainPanel" Property="Background" Value="LightBlue"/>
                                </Trigger>
                                <Trigger Property="IsSelected" Value="False">
                                    <Setter TargetName="MainPanel" Property="Background" Value="Green"/>
                                </Trigger>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter TargetName="MainPanel" Property="Background" Value="Orange"/>
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="False">
                                    <Setter TargetName="MainPanel" Property="Background" Value="LightGray" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
     
                    </Setter.Value>
                </Setter>
            </Style>
     
        </Window.Resources>
        
        <Grid>
            <ListView x:Name="navigator">
     
                <local:ListViewItemCustom Style="{StaticResource PriListViewItemStyle}" DisplayText="DisplayText" Content="Content">
                                    
                </local:ListViewItemCustom>
            </ListView>
        </Grid>
    </Window>


    Ich verstehe einfach nicht warum er mir nicht den "DisplayText" anzeigt, ich mein ich habe es doch hingeschrieben
    Code :
    1
    2
    
    <TextBlock Text="{Binding DisplayText}">
                        </TextBlock>

    Ich weis echt nicht weiter es wäre super wenn mich jemand erleuchten könnte. xD

    Gruss
     
    {Eve}

Ähnliche Themen

  1. Template Klasse
    Von MaxivB im Forum PHP
    Antworten: 20
    Letzter Beitrag: 17.01.09, 18:59
  2. eigene Klasse in Form Klasse
    Von PinkoPalino im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 29.07.07, 20:23
  3. Template Klasse
    Von HolgerX im Forum C/C++
    Antworten: 9
    Letzter Beitrag: 30.03.05, 17:05
  4. Eigene Template Klasse funktioniert nicht.
    Von xamunrax im Forum PHP
    Antworten: 2
    Letzter Beitrag: 18.11.04, 14:56
  5. Klasse/Template
    Von Fluctuator im Forum PHP
    Antworten: 2
    Letzter Beitrag: 11.02.03, 18:38