【发布时间】: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