【问题标题】:Data trigger not working inside listview WPF数据触发器在 listview WPF 中不起作用
【发布时间】:2020-08-10 18:15:47
【问题描述】:

我对 WPF 复杂绑定不是很熟悉,从昨天开始,我不知道如何将后面代码中的值与 ListView 内按钮的 DataTrigger 内的“DataContext”绑定。

我尝试这样做是因为我想隐藏我的列表视图项目每一行的操作按钮(编辑/删除)。所以我必须从“用户”类中检查它的角色属性并切换按钮的可见性。

我在“wpf binding datacontext”上写了很多主题,并尝试了很多潜在的解决方案,但没有成功。

这是我保留的解决方案,因为当我在 DataContext 上放置断点时,我可以看到里面的所有值。

.cs 后面的代码:

        public User _user { get; set; }
        public ObservableCollection<Item> MyItems { get; set; }
        public MyWindow(User user)
        {
            InitializeComponent();
            _user = user;
            DataContext = _user; 
            listItems.ItemsSource = GetItemsList();         
        }

MyWindow.xaml:

 <ListView x:FieldModifier="public" ItemsSource="{Binding MyItems}" Margin="10" Name="listItems" BorderThickness="2" BorderBrush="Black" Style="{StaticResource MaterialDesignListView}">
                        <ListView.View>
                            <GridView x:Name="gridViewItem">
                                <GridViewColumn Width="100" DisplayMemberBinding="{Binding Name}">
                                    <GridViewColumn.Header>
                                        <GridViewColumnHeader Cursor="Hand" Tag="Name">Name</GridViewColumnHeader>
                                    </GridViewColumn.Header>
                                </GridViewColumn>
                                <GridViewColumn Width="180" DisplayMemberBinding="{Binding StartHour}">
                                    <GridViewColumn.Header>
                                        <GridViewColumnHeader Cursor="Hand" Tag="StartHour">StartHour</GridViewColumnHeader>
                                    </GridViewColumn.Header>
                                </GridViewColumn>
                                <GridViewColumn Width="180" DisplayMemberBinding="{Binding EndHour}">
                                    <GridViewColumn.Header>
                                        <GridViewColumnHeader Cursor="Hand" Tag="EndHour">EndHour</GridViewColumnHeader>
                                    </GridViewColumn.Header>
                                </GridViewColumn>                                
                                <GridViewColumn Width="180">
                                    <GridViewColumn.Header>
                                        <GridViewColumnHeader Cursor="Hand" Tag="Actions">Actions</GridViewColumnHeader>
                                    </GridViewColumn.Header>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal" Name="ActionButtonList">                                   
                                                <Button Click="Delete_Click" x:Name="delete_button" BorderBrush="{x:Null}" Tag="{Binding Id}" Background="White" Margin="0" HorizontalAlignment="Left">
                                                    <materialDesign:PackIcon Kind="Trash" Foreground="Black" Width="15" Height="15" />
                                                    <Button.Style>
                                                        <Style TargetType="{x:Type Button}">
                                                            <Setter Property="Visibility" Value="Visible"/>
                                                            <Style.Triggers>
                                                                <DataTrigger Binding="{Binding DataContext.Role}" Value="User">
                                                                    <Setter Property="Visibility" Value="Collapsed"/>
                                                                </DataTrigger>
                                                            </Style.Triggers>
                                                        </Style>
                                                    </Button.Style>
                                                </Button>
                                            </StackPanel>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                            </GridView>
                        </ListView.View>
                    </ListView>

用户.cs:

public partial class User
    {       
        public User()
        {}

        public int Id { get; set; }


        public string Role { get; set; }

    }

调试错误: System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“MyItem_90931F6CDC904A032778416D7F3A5FB410232AF48F7B7245FOE8D783347E9ED5”(HashCode=34262603)上找不到“DataContext”属性。 BindingExpression:Path=DataContext.Role; DataItem='MyItem_90931F6CDC904A032778416D7F3A5FB410232AF48F7B7245FOE8D783347E9ED5' (HashCode=34262603);目标元素是 'Button' (Name='');目标属性是“NoTarget”(类型“对象”)

我认为问题是由于DataContext的使用不明确引起的,它从后面的代码中识别出ListView的内部DataContext而不是外部DataContext。

感谢您的关注和帮助

【问题讨论】:

    标签: c# wpf listview datacontext datatrigger


    【解决方案1】:

    这不是模棱两可的,DataContext 并不存在于您请求它的级别。 你应该怎么做。

    • 创建一个名为 MyWindowViewModel 的类
    • 这个类应该有 User 和 MyItems 作为属性
    • 将 MyWindow.DataContext 设置为 MyWindowViewModel(不要在后面的代码中设置 ItemsSource)
    • 在 xaml 代码中,让 ItemsSource 与 MyItems 保持一致
    • 将 [Binding="{Binding DataContext.Role}"] 替换为类似 ["{Binding Path=DataContext.User.Role,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"]

    您还应该考虑使用 Icommand 而不是点击事件和代码,如果只是禁用按钮而不是隐藏它就可以了,您可以使用 ICommand(请参阅https://www.c-sharpcorner.com/UploadFile/20c06b/icommand-and-relaycommand-in-wpf/

    【讨论】:

      【解决方案2】:

      我终于成功了,解决方案非常简单: 我的代码很好,但问题是我的 Window XAML,我必须为我的 Window 设置一个名称 然后在我的 DataTrigger 中看起来像这样:

      <Button Click="Delete_Click" x:Name="delete_button" BorderBrush="{x:Null}" Tag="{Binding Id}" Background="White" Margin="0" HorizontalAlignment="Left">
                                                          <materialDesign:PackIcon Kind="Trash" Foreground="Black" Width="15" Height="15" />
                                                          <Button.Style>
                                                              <Style TargetType="{x:Type Button}">
                                                                  <Setter Property="Visibility" Value="Visible"/>
                                                                  <Style.Triggers>
                                                                      <DataTrigger Binding="{Binding ElementName=CertifWindow,Path=DataContext.Role}" Value="User">
                                                                          <Setter Property="Visibility" Value="Collapsed"/>
                                                                      </DataTrigger>
                                                                  </Style.Triggers>
                                                              </Style>
                                                          </Button.Style>
                                                      </Button>
      

      希望对大家有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 2013-01-05
        • 2013-06-25
        • 2011-01-26
        • 2013-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多