locked
Checkbox IsSelected mit Binding und Converter RRS feed

  • Allgemeine Diskussion

  • Hallo!

    Ich habe folgendes Problem. Ich möchte eine Seite anzeigen in der ein Liste von Checkboxen zu sehen ist. Über den Boxen wird eine ID angezeigt. Ist die ID in einer Liste (Eigenschaft des ViewModel) bereits enthalten, so soll die Checkbox selektiert sein.

    Ich habe dafür also ein ItemsControl mit einem WrapPanel. ItemsSource wurde auf eine Liste mit Zahlen festgelegt, welche die möglichen IDs beinhalet, die dargestellt werden soll (also beispielsweise 1 - 128).

    Im DataTemplate habe ich dann ein Grid welches 2 Elemente aufnimmt und diese dann untereinander darstellt. Das erte ist ein Textblock, welcher die ID enthält, das zweite die Checkbox. Die Text-Eigenschaft des TextBlocks habe ich an die ItemSource gebunden. Was mir nicht gelingt, ist die IsSelected-Eigenschaft der CheckBox zu binden. Bisher sieht das so aus:

    <ItemsControl ItemsSource="{Binding Path=AllParticipants}" Grid.Row="1">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <toolkit:WrapPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Border BorderBrush="Black" BorderThickness="1">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition Height="Auto" />
                                </Grid.RowDefinitions>                            
                                <TextBlock TextDecorations="Underline" Text="{Binding}" 
                                           HorizontalAlignment="Center" />                            
                                <CheckBox Margin="3" 
                                          IsChecked="{Binding Source={StaticResource DataContextProxy}, Path=DataSource.InvolvedParticipants, Converter={StaticResource InvPartConv}}" 
                                          HorizontalAlignment="Center" Grid.Row="1"/>                            
                            </Grid>
                        </Border>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl><br/> 
    

    InvolvedParticipants ist eine Liste in der die IDs der Checkboxen enthalten sind, die selectiert werden sollen. Im Converter möchte ich dann prüfen, ob die aktuelle ID, welche im TextBlock angezeigt wird, in der Liste enthalten ist und entprechend True oder False zurückgeben. Und hier ist halt der Punkt an dem ich nicht weiß, wie kann ich diese "aktuelle" ID an den Converter weitergeben?

    Viele Grüße
    André

    • Typ geändert Robert Breitenhofer Dienstag, 20. September 2011 11:59 Keine Rückmeldung des Fragenstellender
    Montag, 5. September 2011 09:34

Alle Antworten

  • Für einfache Werte, die du in XAML setzt würde der ConverterParameter reichen, diesen kannst du aber nicht binden, da er kein Dependency Property ist.
    Deshalb musst du in Converter selber ein DP implementieren und die Klasse muss zusätzlich von DependencyObjekt erben.

    Schau dir mal folgenden Link an:

    http://nick-howard.blogspot.com/2011/06/silverlight-4-value-converter.html

    Montag, 5. September 2011 10:22
    Beantworter
  • Danke für die Antwort.

    Ich hab den Artikel gelesen und dann folgendes eingebaut:

    <conv:InvolvedParticipantsConverter x:Key="InvPartConv" 
    
                                                    BindableConverterParameter="{Binding Path=ID}"/>
    
    

    und im Converter:

    public static DependencyProperty BindableConverterParameterProperty = DependencyProperty.Register("BindableConverterParameter", typeof(int),
    
                        typeof(InvolvedParticipantsConverter), null);
    
            
    
    public int BindableConverterParameter
    
    {
    
        get { return (int)GetValue(BindableConverterParameterProperty); }
    
        set { SetValue(BindableConverterParameterProperty, value); }
    
    }
    
    

    Mein Problem ist jetzt, dass BindableConverterParameter immer 0 ist.

    Was mach ich falsch?
    André

     

     


    • Bearbeitet Andre Grimm Montag, 5. September 2011 11:33
    Montag, 5. September 2011 11:31
  • Es kann sein das der DataContext, an der Stelle wo du den Converter deklarierst, nicht vorhanden ist. Deshalb kann das Binding die ID Eigenschaft deiner Datenquelle nicht finden uns es wird immer 0 als Standardwert übergeben.

     

     


    Montag, 5. September 2011 11:49
    Beantworter
  • Hm, keine Ahnung...

    Ich mach das so:

     <Grid x:Name="LayoutRoot" Margin="2">
    
            <Grid.RowDefinitions>
    
                <RowDefinition Height="Auto" />
    
                <RowDefinition />
    
                <RowDefinition Height="Auto" />
    
            </Grid.RowDefinitions>
    
            <Grid.Resources>
    
                <com:DataContextProxy x:Key="DataContextProxy" />
    
                <conv:InvolvedParticipantsConverter x:Key="InvPartConv" 
    
                                                    BindableConverterParameter="{Binding Path=CurrEvent.AllParticipants.ID}"/>
    
            </Grid.Resources>
    
    

    DataContext sollte mein ViewModel sein, dass CurrEvent als Eigenschaft besitzt. CurrEvent ist eine Instanz von Event, welche AllParticipants als Eigenschaft hat, welche wiederum eine Liste von Participant-Instanzen ist, die eine Eigenschaft ID besitzen. Ich hab da ein bisschen was verändert und die Bindungen an das ItemControl und den Textblock sehen jetzt wie folgt aus:

     <ItemsControl ItemsSource="{Binding Path=CurrEvent.AllParticipants}" Grid.Row="1">
    
    
    <TextBlock TextDecorations="Underline" Text="{Binding Path=ID}" 
    
                                           HorizontalAlignment="Center" />                      
    
    

    Warum funktioniert das nicht?



    • Bearbeitet Andre Grimm Montag, 5. September 2011 12:22
    Montag, 5. September 2011 12:21

  • Deklarier mal den DataContexProxy in den Window Resources und setze den DataContext des Grids auf den DataContextProxy.

    <Windows.Resources>
    
                <com:DataContextProxy x:Key="DataContextProxy" />
    
    </Window.Resources>
    
    <Grid DataContext="{StaticResource DataContextProxy}">
    
    <Grid.Resources>
    <conv:InvolvedParticipantsConverter x:Key="InvPartConv" 
    BindableConverterParameter="{Binding Path=CurrEvent.AllParticipants.ID}"/>
    </Grid.Resources>
    
    

     

    Dienstag, 6. September 2011 08:20
    Beantworter
  • Hallo Marco!

    Hab's heut endlich ausprobiert. Funktioniert leider nicht. Ich werd mal schauen, ob ich mit Änderungen am ViewModel das ganze anders hinbekomme.

    Vielen Dank für deine Bemühungen.

    Gruß André

    Montag, 12. September 2011 05:54
  • Ich werd mal schauen, ob ich mit Änderungen am ViewModel das ganze anders hinbekomme.


    ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************
    Dienstag, 20. September 2011 11:58