2015-03-03 53 views
-1

我有以下的ListView列表视图改变外观所选项目

<ListView VerticalAlignment="Top" HorizontalAlignment="Left" Width="175" 
     Height="200" Grid.Row="2" Name="StepsList" SelectionMode="Single" 
     ItemsSource="{Binding Steps}" Margin="0,5,0,0" Grid.RowSpan="2" 
     SelectionChanged="StepsList_SelectionChanged" 
     ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Width="170" Header="Steps"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <Grid Width="165" GotFocus="StepsGrid_OnGotFocus" 
          LostFocus="StepsGrid_OnLostFocus"> 
         <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="105"/> 
           <ColumnDefinition Width="15"/> 
           <ColumnDefinition Width="15"/> 
         </Grid.ColumnDefinitions> 
         <views:EditableTextBlock Grid.Column="0" 
           Text="{Binding Number}" HorizontalAlignment="Left"/> 
         <Button Name="StepUp" Grid.Column="1" 
          Content="↑" HorizontalAlignment="Right"/> 
         <Button Grid.Column="2" Content="↓" HorizontalAlignment="Right"/> 
         </Grid> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
       <GridView.ColumnHeaderContainerStyle> 
       <Style TargetType="{x:Type GridViewColumnHeader}"> 
        <Setter Property="IsEnabled" Value="False"/> 
       </Style> 
       </GridView.ColumnHeaderContainerStyle> 
      </GridView> 
    </ListView.View> 
</ListView> 

想我想的是,如果选择的项目和上/下按钮,如果选择的被禁用Button s为唯一可见项目是列表中最顶部/最底部的项目。
我该如何做到这一点?

+1

为什么你会禁用向下顶行? – Paparazzi 2015-03-03 14:40:01

+0

我的意思是,如果选择的项目是最顶部/最底部的项目,我想禁用上/下按钮。 – 2015-03-03 14:42:44

+0

@Nabil答:为你做了建议的答案吗? – 2015-03-03 20:12:54

回答

0

我结束了以下内容。
XML

<ListView VerticalAlignment="Top" HorizontalAlignment="Left" Width="175" Height="200" Grid.Row="2" Name="StepsList" SelectionMode="Single" 
         ItemsSource="{Binding Steps}" 
         Margin="0,5,0,0" Grid.RowSpan="2" SelectionChanged="StepsList_SelectionChanged"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Width="170" Header="Steps"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <Grid Width="165"> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="105"/> 
              <ColumnDefinition Width="15"/> 
              <ColumnDefinition Width="15"/> 
             </Grid.ColumnDefinitions> 
             <views:EditableTextBlock Grid.Column="0" Text="{Binding Number}" HorizontalAlignment="Left"/> 
             <Button Name="StepUp" Grid.Column="1" Content="↑" HorizontalAlignment="Right" Visibility="Hidden" Click="StepUp_OnClick"/> 
             <Button Name="StepDown" Grid.Column="2" Content="↓" HorizontalAlignment="Right" Visibility="Hidden" Click="StepDown_OnClick"/> 
            </Grid> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
         <GridView.ColumnHeaderContainerStyle> 
          <Style TargetType="{x:Type GridViewColumnHeader}"> 
           <Setter Property="IsEnabled" Value="False"/> 
          </Style> 
         </GridView.ColumnHeaderContainerStyle> 
        </GridView> 
       </ListView.View> 
      </ListView> 

C#

private void StepsList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     _viewModel.SetStep(StepsList.SelectedIndex); 

     var gridView = StepsList.View as GridView; 
     var listBoxItem = StepsList.ItemContainerGenerator.ContainerFromItem(StepsList.SelectedItem) as ListBoxItem; 
     var listBoxItems = Enumerable.Range(0, StepsList.Items.Count).Select(x => StepsList.ItemContainerGenerator.ContainerFromIndex(x) as ListBoxItem); 
     var column = gridView.Columns[0]; 
     Button up; 
     Button down; 
     foreach (var contentPresenter in listBoxItems.Where(x => x != null).Select(x => x.GetVisualChild<ContentPresenter>())) 
     { 
      up = column.CellTemplate.FindName("StepUp", contentPresenter) as Button; 
      down = column.CellTemplate.FindName("StepDown", contentPresenter) as Button; 
      up.Visibility = Visibility.Hidden; 
      down.Visibility = Visibility.Hidden; 
      up.IsEnabled = true; 
      down.IsEnabled = true; 
     } 

     if (listBoxItem == null) return; 
     var myContentPresenter = listBoxItem.GetVisualChild<ContentPresenter>(); 

     up = column.CellTemplate.FindName("StepUp", myContentPresenter) as Button; 
     down = column.CellTemplate.FindName("StepDown", myContentPresenter) as Button; 
     if (up == null) return; 
     up.Visibility = Visibility.Visible; 
     if (Equals(_viewModel.Steps.First(), StepsList.SelectedItem)) 
      up.IsEnabled = false; 
     if (down == null) return; 
     down.Visibility = Visibility.Visible; 
     if (Equals(_viewModel.Steps.Last(), StepsList.SelectedItem)) 
      down.IsEnabled = false; 
    } 
1

这是一个使用MultiBinding的解决方案。您可能需要调整逻辑,布拉姆说,我不认为你真的要禁用两个外部边界点两个按钮,但是这是你这么说的话......

XAML:

<Button Name="StepUp" Grid.Column="1" Content="↑" HorizontalAlignment="Right" > 
            <Button.Visibility> 
             <MultiBinding Converter="{StaticResource OuterboundsConverter}"> 
              <Binding Path="DataContext.Steps" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}"/> 
              <Binding></Binding> 
             </MultiBinding> 
            </Button.Visibility> 
           </Button> 
           <Button Grid.Column="2" Content="↓" HorizontalAlignment="Right"> 
            <Button.Visibility> 
             <MultiBinding Converter="{StaticResource OuterboundsConverter}"> 
              <Binding Path="DataContext.Steps" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}"/> 
              <Binding></Binding> 
             </MultiBinding> 
            </Button.Visibility> 
           </Button> 

转换器:

public class OuterboundsConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     Visibility vis = Visibility.Visible; 


     if (values != null) 
     { 
      ObservableCollection<string> steps = values[0] as ObservableCollection<string>; 
      string item = values[1] as string; 

      if (steps != null && item != null) 
      { 
       if (steps.Count > 0) 
       { 
        if (steps[0] == item || steps[steps.Count - 1] == item) 
        { 
         vis = Visibility.Collapsed; 
        } 
       } 
      } 
     } 


     return vis; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

确保将窗口调整为UserControl,如果这不是一个窗口等在绑定路径中,以及您使用的任何类型的集合,我只是使用ObservableCollection 为我的示例。转换器可能会使用一些更多的检查来确保它们的值是正确的[]等等,但是你会得到 – 2015-03-03 14:50:23

+0

btw的想法,我假设你实际上想为每个按钮都有一个单独的转换器。一个是向上的,一个是向下的,所以,例如,当它位于列表顶部时,向下按钮仍然会显示,但是当向上按钮位于列表的底部时仍然应该显示向上按钮 – 2015-03-03 14:58:28