我有一个 DataGrid,其中定义了一些列。这些行绑定(bind)到 ObservableCollection。 网格旁边有一个按钮,该按钮应该可见或不可见,具体取决于行数。当有 2 行(或更多行)时,它应该是可见的。 这个想法是使用 DataGrid.Rows.Count 或 DataGrid.Items.Count。
编译器不知道属性“DataGrid.Rows”或“DataGrid.Items”。你知道另一种方法吗?我喜欢仅将其放在 Xaml 中,而不使用转换器。 (我知道可以通过对 itemcollection 进行计数的转换器来实现)有更聪明的方法吗?
<Grid>
<DataGrid Name="dg1">
<DataGrid.Columns>
...
</DataGrid.Columns>
</DataGrid>
<Button Name="btn1" Visibility="Visibility">
</Button>
<Grid.Triggers>
<Trigger SourceName="dg1" Property="DataGrid.Items.Count" Value="0">
<Setter TargetName="btn1" Property="Visibility" Value="Hidden"></Setter>
</Trigger>
<Trigger SourceName="dg1" Property="DataGrid.Items.Count" Value="1">
<Setter TargetName="btn1" Property="Visibility" Value="Hidden"></Setter>
</Trigger>
</Grid.Triggers>
最佳答案
您可以通过在要显示/隐藏的按钮上设置 DataTrigger 并绑定(bind)到 DataGrid 上的 Items.Count
属性来实现此目的。
每当集合中的项目数达到 0 或 1 时,该按钮就会隐藏,当集合中的项目数超过 1 时,该按钮就会再次显示。
XAML:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<DataGrid Name="dg1" ItemsSource="{Binding MyFooCollection}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Id}" />
<DataGridTextColumn Binding="{Binding Name}" />
</DataGrid.Columns>
</DataGrid>
<StackPanel>
<Button Content="Add row" Click="btnAdd" />
<Button Content="Remove row" Click="btnRemove" />
<Button Content="Will be shown/hidden">
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding Items.Count, ElementName=dg1}" Value="0">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
<DataTrigger Binding="{Binding Items.Count, ElementName=dg1}" Value="1">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</StackPanel>
</StackPanel>
</Window>
代码隐藏:
public partial class MainWindow : Window
{
public ObservableCollection<Foo> MyFooCollection { get; set; }
public MainWindow()
{
InitializeComponent();
this.MyFooCollection = new ObservableCollection<Foo>
{
new Foo(1, "Bar1"), new Foo(2, "Bar2"), new Foo(3, "Bar3"),
new Foo(4, "Bar4"), new Foo(5, "Bar5"), new Foo(6, "Bar6")
};
this.DataContext = this;
}
private void btnAdd(object sender, RoutedEventArgs e)
{
MyFooCollection.Add(new Foo(11, "Test1"));
}
private void btnRemove(object sender, RoutedEventArgs e)
{
if (MyFooCollection.Any())
MyFooCollection.RemoveAt(0);
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public Foo(int id, string name)
{
Id = id;
Name = name;
}
}
}
关于wpf 触发器 Datagrid RowCount,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13493413/