2015-03-03 31 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

相關問題