2013-06-04 190 views
1

我在綁定時遇到了一些問題。我想將2個按鈕與ListBoxSelectedItem綁定。綁定到SelectedItem的按鈕可見性

ListBox包含多個值並顯示它們(名稱,年齡...)。當用戶選擇ListBox中的一個條目時,應彈出2個「刪除」和「更改」按鈕(<-可見),因此這意味着按鈕 - 可見性應該與ListBoxSelectedItem綁定,並且緊挨着列表框項目(如iPhone的「刪除」按鈕)。

我的代碼實際上使得按鈕可見,當我選擇一個項目,但問題是所有項目的所有按鈕都可見! 實際的代碼(這需要固定)是這個(可見性部分):

<Button DataContext="{Binding DataContext, ElementName=Window}" FontSize="15" Grid.Row="0" Content="Delete" Visibility="{Binding Path=SelectedItem, Mode=OneWay, ElementName=lbuser, Converter={StaticResource VisibilityConverter}}" Command="{Binding Delete}"/> 
<Button DataContext="{Binding DataContext, ElementName=Window}" FontSize="15" Grid.Row="1" Content="Change" Visibility="{Binding Path=SelectedItem, Mode=OneWay, ElementName=lbuser, Converter={StaticResource VisibilityConverter}}" Command="{Binding Change}" /> 

但是,如果有人需要的全部代碼,那就是:

<Grid Height="Auto"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="212"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="15"/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
</Grid.RowDefinitions> 
    <ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" x:Name="lbuser" ItemsSource="{Binding Users, Mode=TwoWay}" ScrollViewer.VerticalScrollBarVisibility="Auto" Grid.ColumnSpan="2" SelectedItem="{Binding MySelectedListView, Mode=TwoWay}" Height="390" Width="Auto" > 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 

        <Grid Grid.Column="0"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
         </Grid.RowDefinitions> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="50"/> 
          <ColumnDefinition Width="50"/> 
          <ColumnDefinition Width="90"/> 
          <ColumnDefinition Width="15"/> 
          <ColumnDefinition Width="150"/> 
         </Grid.ColumnDefinitions> 
         <TextBlock Text="{Binding Path=Bezeichnung}" Grid.ColumnSpan="4" FontSize="22.5" FontWeight="ExtraBold"/> 
         <TextBlock Grid.Row="1" Text="Name"/> 
         <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Name}"/> 
         <TextBlock Grid.Row="1" Grid.Column="2" Text="Age"/> 
         <TextBlock Grid.Row="1" Grid.Column="4" Text="{Binding Path=Age, Converter={StaticResource EuroConverter}}"/> 
         <TextBlock Grid.Row="2" Text="E-Mail"/> 
         <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=EMail}" Width="Auto"/> 
         <TextBlock Grid.Row="2" Grid.Column="2" Text="Phone"/> 
         <TextBlock Grid.Row="2" Grid.Column="4" Text="{Binding Path=Phone, Converter={StaticResource EuroConverter}}"/> 
         <TextBlock Grid.Row="3" Text="Born"/> 
         <TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding Path=YearBorn}" Width="Auto"/> 
         <TextBlock Grid.Row="3" Grid.Column="2" Text="Birthplace"/> 
         <TextBlock Grid.Row="3" Grid.Column="4" Text="{Binding Path=Birthplace}"/> 
        </Grid> 
        <Grid Grid.Column="1"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
         </Grid.RowDefinitions> 

        <Button DataContext="{Binding DataContext, ElementName=Window}" FontSize="15" Grid.Row="0" Content="Delete" Visibility="{Binding Path=SelectedItem, Mode=OneWay, ElementName=lbuser, Converter={StaticResource VisibilityConverter}}" Command="{Binding Delete}"/> 
        <Button DataContext="{Binding DataContext, ElementName=Window}" FontSize="15" Grid.Row="1" Content="Change" Visibility="{Binding Path=SelectedItem, Mode=OneWay, ElementName=lbuser, Converter={StaticResource VisibilityConverter}}" Command="{Binding Change}" /> 
        </Grid> 
       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
</ListBox> 
</Grid> 

編輯:VisibilityConverter

public class VisibilityConverter : IValueConverter 
{ 
    #region [ IValueConverter ] 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
      return System.Windows.Visibility.Collapsed; 

     return System.Windows.Visibility.Visible; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 

    #endregion 
} 

value是selecteditem,這意味着當ListBox有2個Items並且我點擊一個Item時,VisibilityConverter將被調用4次並將Visibility設置爲true。通過轉換器的4個調用,該值始終是SelectedItem。

+2

VisibilityConverter有什麼作用? Visibilityconverter必須能夠處理SelectedItem的類型。您是否嘗試在實現VisibilityConverter時設置斷點? – Sascha

+0

編輯的問題。 – Rudi

回答

0

嘗試將可見性綁定到MySelectedListView。這是列表框中所選項目所綁定的ViewModels屬性。那麼值應該是正確的類型。

<Button DataContext="{Binding DataContext, ElementName=Window}" FontSize="15" Grid.Row="0" Content="Delete" Visibility="{Binding Path=MySelectedListView, Mode=OneWay, Converter={StaticResource VisibilityConverter}}" Command="{Binding Delete}"/> 

你應該能夠省略DataContext="{Binding DataContext, ElementName=Window}"如果您還沒有設置在DataContext上了一個臺階。

編輯:另一種選擇是綁定到User視圖模型類中的ButtonVisibility屬性。在MySelcetedListView設置器中,將現有對象的值設置爲CollapsedHidden(無論您的需要如何),將新對象的值設置爲Visible。那麼綁定將會是Visibility="{Binding ButtonVisibility}"

+0

我已經在另一個ViewModel中設置DataContext(不要問爲什麼......:P),所以我需要這個條目。綁定到_MySelectedListView_不起作用,它顯示相同的結果。 ViewModel中的屬性如下所示:'public User MySelectedListView' – Rudi

相關問題