Laden...

Command wird bei Databinding nicht ausgelöst und ScrollViewer Problem

Erstellt von ogre vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.624 Views
O
ogre Themenstarter:in
123 Beiträge seit 2006
vor 11 Jahren
Command wird bei Databinding nicht ausgelöst und ScrollViewer Problem

Hallo,

ich habe eine ObservableCollection, die ich an ein ItemsControl gebunden habe. Die Einzelnen Items sollen als Buttons dargestellt werden. Das ganze sieht so aus:


    <ScrollViewer>
        <Grid DataContext="{StaticResource mainViewModel}" HorizontalAlignment="Left" VerticalAlignment="Top">
        
            <ItemsControl Background="Red" ItemsSource="{Binding Path=ShelfsCollection}" HorizontalAlignment="Left" VerticalAlignment="Top">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Canvas>
                            <Button HorizontalAlignment="Left" 
                                    VerticalAlignment="Top"
                                    BorderThickness="0" 
                                    BorderBrush="Black"  
                                    Width="{Binding CategoryWidth}" Height="{Binding Path=CategoryHeight}" 
                                    Margin="{Binding Path=ShelfLocation,Converter={StaticResource PointToMargin}}"
                                    Command="{Binding Path=AddPointCommand}"
                                    Content="{Binding Path=ShelfNumber}" />
                        </Canvas>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
</ScrollViewer>

Das ganze funktioniert sehr gut, allerdings habe ich zwei Probleme:

  1. Das Command AddPointCommand wird im Binding nicht ausgelöst. Der Code Behind sollte richtig sein, da das Command ausgelöst wird, wenn ich einen einfachen Button an das Command binde:
<ScrollViewer>
        <Grid DataContext="{StaticResource mainViewModel}" HorizontalAlignment="Left" VerticalAlignment="Top">
            <Button HorizontalAlignment="Left" 
                                    VerticalAlignment="Top"
                                    BorderThickness="0" 
                                    BorderBrush="Black"  
                                    Command="{Binding AddPointCommand}"
                                    Content="XXXXXX" />

       </Grid>
</ScrollViewer>

Ich nehmen an, dass der Fehler im XAML zu suchen ist, oder ?

  1. Die Collection "Buttons" passen nicht auf den Bildschirm, deshalb benutze ich ein ScrollViewer, um alle Element auf dem Bildschirm darstellen zu können.
    Problem, der ScrollViewer wird zwar angezeigt, man kann aber nicht Scrollen, siehe Bild im anhhang. Ich nehmen an, das liegt auch am Databinding, oder?
6.862 Beiträge seit 2003
vor 11 Jahren

Hallo,

zu 1.: Er kann das Command nicht finden, da der DataContext ja nen ganz anderer ist. Im funktionierenden Beispiel ist der DataContext ja das mainViewModel. In der Liste dagegen ist der DataContext ja das Item, für das das Template angewendet und nicht dein mainViewModel.

zu 2.: Hat nichts mit DataBinding zu tun, sondern dem Canvas was da im Template eh völlig überflüssig ist. Die Canvas haben ne Größe von 0 und daher ist auch Sicht des ScrollViewers alles paletti da ja alle Items reinpassen.

Und noch nen kleiner Hinweis am Ende: Bitte immer [Hinweis] Wie poste ich richtig? Punkt 1.2 beachten.

Baka wa shinanakya naoranai.

Mein XING Profil.

O
ogre Themenstarter:in
123 Beiträge seit 2006
vor 11 Jahren

hallo talla,

danke für die anmerkung.

zu 2.
wenn ich das canvas weglasse passiert das, was ich hier beschrieben habe. wie kann ich dem canvas die entsprechende höhe mitgeben, oder sollte ich eine komplett anderen ansatz nehmen?

thx ogre.

6.862 Beiträge seit 2003
vor 11 Jahren

Dann hast du den Vorschlag aus dem anderne genannten Thread aber nicht richtig umgesetzt. Ich sprach dort von einem Canvas als ItemsPanel für dein ItemsControl und nicht davon im ItemTemplate ein Canvas zu benutzen. Für die Items werden nur die entsprechenden Attached Properties gesetzt um diese dann innerhalb des ItemPanels zu positionieren.

Baka wa shinanakya naoranai.

Mein XING Profil.

O
ogre Themenstarter:in
123 Beiträge seit 2006
vor 11 Jahren

Hallo Talla,

ich stehe hier echt auf dem Schlauch und kommen mit den Attached Properties nicht weiter:

<ItemsControl ItemsSource="{Binding Path=Shelfs}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas>
                        </Canvas>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemContainerStyle>
                    <Style TargetType="ContentPresenter">
                        <Setter Property="Canvas.Width" Value="{Binding CategorieWidth}" />
                        <Setter Property="Canvas.Height" Value="{Binding CategorieHeight}" />
                        <Setter Property="Canvas.Margin" Value="{Binding Path=ShelfLocation}" />
                    </Style>
                </ItemsControl.ItemContainerStyle>
            </ItemsControl>

Irgendwie bekomme ich das Binding nicht hin, vielleicht hast Du ja noch einen Tipp für mich 😃