Benutzer mit den meisten Antworten
Binding eines Controls innerhalb eines Datatemplates

Frage
-
Hallo zusammen
Ich komme hier gerade nicht mehr weiter und hoffe, dass mir jemand helfen kann.
Ich habe auf meiner Seite ein ItemsControl
<ItemsControl x:Name="icLinks" Grid.Column="1" ItemsSource="{Binding Path=Links}" Margin="10" ItemTemplate="{StaticResource normalTemplate}" />
In den Page Resources habe ich zwei DataTemplates definiert. Das normalTemplate wird standartmässig angezeigt. Nun hat man die Möglichkeit einen Datensatz zu editieren. Wenn man auf Editieren klickt, so wird das zweite DataTemplate (editTemplate) angezeigt. Dieses Template sieht folgendermassen aus:
<DataTemplate x:Key="editTemplate"> <Grid Margin="3"> <Button Command="{Binding ClickCommand}" Cursor="Hand" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Style="{StaticResource actionListButtonStyle}" Click="Button_Click"> <Grid HorizontalAlignment="Stretch"> <Grid.RowDefinitions> <RowDefinition Height="0.6*" /> <RowDefinition Height="0.4*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="50" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Image Source="/FLHorseRacingSoftware;Component/Images/iconlarge.png" Height="32" Width="32" Stretch="UniformToFill" Grid.RowSpan="2" Margin="5" /> <TextBox Grid.Column="1" VerticalAlignment="Center" Text="{Binding Path=link, Mode=TwoWay}" KeyDown="TextBox_KeyDown" FontWeight="Bold" FontSize="12" TextWrapping="NoWrap" ToolTipService.ToolTip="{Binding Path=title}" Margin="0,5,5,0"/> <TextBox Grid.Column="2" VerticalAlignment="Center" Text="{Binding Path=title, Mode=TwoWay}" KeyDown="TextBox_KeyDown" FontWeight="Bold" FontSize="12" TextWrapping="NoWrap" ToolTipService.ToolTip="{Binding Path=title}" Margin="0,5,5,0"/> <TextBox Text="{Binding Path=description, Mode=TwoWay}" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="1" FontSize="9" KeyDown="TextBox_KeyDown" TextWrapping="Wrap" ToolTipService.ToolTip="{Binding Path=description}" Margin="0,5,5,5" /> <CheckBox x:Name="chkAdmin" Grid.Column="3" IsChecked="{Binding is_admin_link, Mode=TwoWay}" Visibility="{Binding IsVisible}" Content="{Binding Path=ApplicationStrings.TextShowToEverybody, Source={StaticResource ResourceWrapper}}" VerticalAlignment="Center" Margin="0,5,5,0" /> <CheckBox Grid.Row="1" Grid.Column="3" IsChecked="{Binding delete, Mode=TwoWay}" Content="{Binding Path=ApplicationStrings.TextDelete, Source={StaticResource ResourceWrapper}}" VerticalAlignment="Center" Margin="0,5,5,5" /> </Grid> </Button> </Grid> </DataTemplate>
Dabei ist das Visibility property der Checkbox "chkAdmin" an ein Property in meinem Viewmodel gebunden. Wenn der eingeloggte Benutzer in der Admingruppe ist, so wird die Checkbox angezeigt, ansonsten nicht.
Diese Eigenschaft wird im Konstruktor des Viewmodels gesetzt, was auch einwandfrei funktioniert./// <summary> /// setzt oder gibt zurück ob die checkbox 'Allen anzeigen' im datatemplate sichtbar ist oder nicht /// </summary> public Visibility IsVisible { get { return _isVisible; } private set { _isVisible = value; Changed("IsVisible"); } }
Leider funktioniert dieses Binding nicht, das heisst der getter in der Eigenschaft IsVisible in meinem ViewModel wird gar nie aufgerufen und die Checkbox wird immer angezeigt, egal ob die Eigenschaft Visibility.Collapsed oder Visibility.Visible ist.
Wie bringe ich das DataTemplate dazu mein Control richtig ein- bzw. auszublenden?
Vielen Dank im Voraus für eure Hilfe
Liebe Grüsse
Manfred
Samstag, 6. November 2010 11:43
Antworten
-
Ich denke ich habe das Problem gefunden, es ist ein Denkfehler meinerseits. Der Datacontext der Checkbox ist natürlich nicht das Viewmodel, sondern das Geschäftsobjekt. Somit kann ich das Visibility Property natürlich nicht so an eine Eigenschaft aus meinem Viewmodel binden.
Manfred
- Als Antwort markiert Robert Breitenhofer Freitag, 19. November 2010 14:27
Samstag, 6. November 2010 14:40 -
Hallo Manfred.
Du kannst die Visibility Property auch direkt an einen Boolean hängen.
Du musst dafür nur einen Converter schreiben:
public class VisibilityConverter : IValueConverter { object IValueConverter.Convert(object value, Type targetType,object parameter, CultureInfo culture) { try { if (Convert.ToBoolean(value.ToString())) return System.Windows.Visibility.Visible; } catch { } return System.Windows.Visibility.Collapsed; } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return null; } }
Daniel
Gruß Daniel http://www.silverlight-community.de - Silverlight Community und Usergroups- Als Antwort markiert Robert Breitenhofer Freitag, 19. November 2010 14:28
Montag, 8. November 2010 12:09
Alle Antworten
-
Ich denke ich habe das Problem gefunden, es ist ein Denkfehler meinerseits. Der Datacontext der Checkbox ist natürlich nicht das Viewmodel, sondern das Geschäftsobjekt. Somit kann ich das Visibility Property natürlich nicht so an eine Eigenschaft aus meinem Viewmodel binden.
Manfred
- Als Antwort markiert Robert Breitenhofer Freitag, 19. November 2010 14:27
Samstag, 6. November 2010 14:40 -
Hallo Manfred.
Du kannst die Visibility Property auch direkt an einen Boolean hängen.
Du musst dafür nur einen Converter schreiben:
public class VisibilityConverter : IValueConverter { object IValueConverter.Convert(object value, Type targetType,object parameter, CultureInfo culture) { try { if (Convert.ToBoolean(value.ToString())) return System.Windows.Visibility.Visible; } catch { } return System.Windows.Visibility.Collapsed; } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return null; } }
Daniel
Gruß Daniel http://www.silverlight-community.de - Silverlight Community und Usergroups- Als Antwort markiert Robert Breitenhofer Freitag, 19. November 2010 14:28
Montag, 8. November 2010 12:09