Listview项目内的UWP按钮

最后发布: 2016-07-13 15:00:41


问题

我正在开发我的第一个UWP应用,我想创建一个这样的UI 对于每个列表项(项目),将有一组按钮。 对于某些列表项(项目),某些按钮有时会被禁用。 因此,我需要在那些列表项(项目)中禁用和更改此类按钮的图像。

我试图使用这样的列表视图来实现它。 但是我不确定如何根据情况启用/禁用某些按钮。

尝试添加DataContextChanged事件并尝试访问那里的按钮。 但不确定如何访问这些按钮。

请让我知道以下方法是否正确,或者是否有更好的方法来完成上图中我要实现的目标。

 <ListView x:Name="stepsListView" Margin="10,0,0,0" RequestedTheme="Dark" FontSize="24" Background="{StaticResource procedure_app_white}" Foreground="Black" BorderThickness="1.5" BorderBrush="Transparent" ItemsSource="{Binding projectList}"  HorizontalAlignment="Left">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        </Style>
    </ListView.ItemContainerStyle>

    <!-- Item -->
    <ListView.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="0,0,0,1" BorderBrush="#c0c0c0">
                <Grid Width="auto" HorizontalAlignment="Stretch" DataContextChanged="Grid_DataContextChanged" >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="50"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="100"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock VerticalAlignment="Center" FontSize="30" Grid.Row="0" Grid.ColumnSpan="7" Text="{Binding projectName}" Foreground="{StaticResource procedure_app_orange_text }" />

                    <Button x:Name="warningButton" Width="40" Height="40" Grid.Column="1"  Grid.Row="1" Tag="{Binding projectId}" Click="warningButtonClick" Foreground="{StaticResource procedure_app_orange_text }">
                        <Button.Background>
                            <ImageBrush ImageSource="Asset/step_ncwr.png">
                            </ImageBrush>
                        </Button.Background>
                    </Button>
                    <Button x:Name="commentButton" Width="40" Height="40" Grid.Column="2"   Grid.Row="1"  Tag="{Binding projectId}" Click="CommentButtonClick" Foreground="{StaticResource procedure_app_orange_text }" IsTapEnabled="True">
                    <Button.Background>
                        <ImageBrush ImageSource="Asset/step_comment.png">
                        </ImageBrush>
                    </Button.Background>
                    </Button>
                    <Button x:Name="imageButton" Width="40" Height="40" Grid.Column="3"  Grid.Row="1"  Tag="{Binding projectId}" Click="ImageButtonClick" Foreground="{StaticResource procedure_app_orange_text }">
                        <Button.Background>
                            <ImageBrush ImageSource="Asset/step_image.png">
                            </ImageBrush>
                        </Button.Background>
                    </Button>
                </Grid>
            </Border>
        </DataTemplate>
    </ListView.ItemTemplate>
c# xaml listview uwp uwp-xaml
回答

答案是变量取决于您所使用的结构,因此我将做一些假设并加以遵循。

首先,我假设您的ViewModel具有一个名为ProjectListObservableCollection ,并且此ProjectListProjectModel

ProjectModel.cs

public class ProjectModel : INotifyPropertyChanged{
      private bool _isNcwrEnabled;
      public bool IsNcwrEnabled{
          get{ return _isNcwrEnabled; }
          set{ _isNcwrEnabled = value; OnPropertyChanged("IsNcwrEnabled"); }
      }
      private bool _isCommentEnabled;
      public bool IsCommentEnabled{
          get{ return _isCommentEnabled; }
          set{ _isCommentEnabled= value; OnPropertyChanged("IsCommentEnabled"); }
      }
      private bool _isImageEnabled;
      public bool IsImageEnabled{
          get{ return _isImageEnabled; }
          set{ _isImageEnabled= value; OnPropertyChanged("IsImageEnabled"); }
      }

    public void OnPropertyChanged(String prop)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

在您的ViewModel您应该拥有

ObservableCollection<ProjectModel> ProjectList {get; private set; }

最终在您View

    <Button IsEnabled="{Binding IsNcwrEnabled}" x:Name="warningButton" Width="40" Height="40" Grid.Column="1"
            Grid.Row="1" Tag="{Binding projectId}" Click="warningButtonClick" 
            Foreground="{StaticResource procedure_app_orange_text }">
         <Button.Background>
             <ImageBrush ImageSource="Asset/step_ncwr.png"/>
         </Button.Background>
    </Button>
    <Button IsEnabled="{Binding IsCommentEnabled}" x:Name="commentButton" Width="40" Height="40" Grid.Column="2"
            Grid.Row="1"  Tag="{Binding projectId}" Click="CommentButtonClick" 
            Foreground="{StaticResource procedure_app_orange_text }" IsTapEnabled="True">
         <Button.Background>
             <ImageBrush ImageSource="Asset/step_comment.png"/>
         </Button.Background>
     </Button>
     <Button IsEnabled="{Binding IsImageEnabled}" x:Name="imageButton" Width="40" Height="40" Grid.Column="3"
             Grid.Row="1"  Tag="{Binding projectId}" Click="ImageButtonClick" 
             Foreground="{StaticResource procedure_app_orange_text }">
         <Button.Background>
             <ImageBrush ImageSource="Asset/step_image.png"/>
         </Button.Background>
     </Button>

变更摘要

  1. ListView绑定到的集合中的模型需要包含使Buttons绑定到的已启用属性。
  2. View ,将Buttons绑定到新属性