【问题标题】:UWP buttons inside Listview itemsListview 项目内的 UWP 按钮
【发布时间】:2016-11-16 06:07:43
【问题描述】:

我正在开发我的第一个 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


    【解决方案1】:

    答案是变量取决于您采用的结构,因此我将做出一些假设并顺其自然。

    首先我假设您的ViewModel 有一个名为ProjectListObservableCollection,并且这个ProjectList 是由ProjectModel 组成的

    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 绑定到您的新属性

    【讨论】:

    • 非常感谢安东尼的详细回答。因此,如果我想在禁用时更改图像。我需要在 ProjectModel 中定义另一个属性,如 ncwrImage 并根据条件设置图像,并在 ImageBrush 中设置为 ImageSource="{Binding ncwrImage }" 。对吗?
    • 如果您想更改图像,我将创建一个数据触发器,根据模型的 enabled 属性切换图像源
    • @Madhu 如果这个答案对你有用,请不要忘记勾选并投票,以便其他人可以使用它
    • 谢谢安东尼,我会将此标记为答案。但是我仍然找不到做这两件事的方法。
      1。如何使用绑定隐藏一些按钮。看起来我需要设置 Visibility=collapse。但不知道如何使用我拥有的 bool 来做到这一点。我试过这个stackoverflow.com/questions/7000819/…,但它似乎不适用于uwp。
      2。如何使用该布尔值更改上述代码中的 ImageBrush ImageSource。我查看了您提供的链接,但 uwp 不支持这些样式触发器。 :-(
    • 我按照你的建议添加了一个新问题stackoverflow.com/questions/38374143/…
    猜你喜欢
    • 1970-01-01
    • 2018-10-10
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多