Template + Databinding auf eigene Klasse

{Eve}

Mitglied
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:
<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:
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:
<TextBlock Text="{TemplateBinding Content}" Width="Auto" ...


schonmal den Text darstellen kann. Allerdings auch nur weil ich mit
Code:
public String DisplayText
        {
            get 
            {
                return (String)Content;
            }
            set
            {
                Content = value;
            }
        }

auf das vererbte Attribut Content zugreife.

Ich möchte nun die Variablen
Code:
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
 
Zuletzt bearbeitet:
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.
 
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:
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:
<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:
<TextBlock Text="{Binding DisplayText}">
                    </TextBlock>

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

Gruss
 
Zurück