如何从 DataGridTemplateColumn.CellTemplate 访问按钮

Posted

技术标签:

【中文标题】如何从 DataGridTemplateColumn.CellTemplate 访问按钮【英文标题】:How to access button from DataGridTemplateColumn.CellTemplate 【发布时间】:2015-08-28 03:18:02 【问题描述】:

我有以下用于 DataGrid 的 .xaml 并希望在 .cs 代码中的特定条件下显示/隐藏按钮 .xaml 代码如下

<DataGridTemplateColumn Header="Action" Width="auto" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Button x:Name="btnConfirm" Content="Confirm" Click="ConfirmButton_Click"  Height="auto" Width="auto"  Opacity="100" Background="Transparent" BorderBrush="Transparent" HorizontalAlignment="Left"/>
                <Button x:Name="btnDecline" Content="Decline" Click="btnDecline_Click" Height="auto" Width="auto"  Opacity="100" Background="Transparent" BorderBrush="Transparent" HorizontalAlignment="Left" />
                <Button x:Name="btnCancel" Content="Cancel" Click="btnCancel_Click" Height="auto" Width="auto"  Opacity="100" Background="Transparent" BorderBrush="Transparent" HorizontalAlignment="Left"/>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

和.cs代码是一样的

foreach (sp_ProcessingJobsResult item in grdUnConfirmJobs.ItemsSource)

var row = grdUnConfirmJobs.ItemContainerGenerator.ContainerFromItem(item) as System.Windows.Controls.DataGridRow;
if (item.Status == "Cancellation Requested.")
    
      //how find control    
    

【问题讨论】:

我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 ***.com/questions/19379946/…的可能重复 【参考方案1】:

您必须为此使用绑定。所以,让我们采取一种快速的方法:

这是背后的代码:

public partial class MainWindow : Window

    public bool ButtonIsVisible
    
        get  return (bool)GetValue(ButtonIsVisibleProperty); 
        set  SetValue(ButtonIsVisibleProperty, value); 
    

    // Using a DependencyProperty as the backing store for ButtonIsVisible.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ButtonIsVisibleProperty =
        DependencyProperty.Register("ButtonIsVisible", typeof(bool), typeof(MainWindow), new UIPropertyMetadata(true));

    public ObservableCollection<Person> items  get; set; 

    public MainWindow()
    
        InitializeComponent();
        items = new ObservableCollection<Person>();
        items.Add(new Person()  Name = "FirstName" );
        items.Add(new Person()  Name = "SecondName" );

        this.DataContext = this;
    

这是我的示例的模型:

public class Person : INotifyPropertyChanged

    private string _Name;

    public string Name
    
        get  return _Name; 
        set
        
            _Name = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        
    

    public event PropertyChangedEventHandler PropertyChanged = delegate  ;

您的 Visibility 不是 bool 类型,因此我们需要一个 Converter:

public class BoolToVis : IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    
        var isVisible = (bool)value;

        return isVisible ? Visibility.Visible : Visibility.Hidden;
    

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    
        throw new NotImplementedException();
    

这是完整的 XAML 代码:

<Window x:Class="DataGridCellsBackground.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"
    xmlns:local="clr-namespace:DataGridCellsBackground"        >
<Grid>
    <Grid.Resources>
        <local:BoolToVis x:Key="BoolTovisibilityConverter"/>
    </Grid.Resources>
    <DataGrid SelectionUnit="Cell" 
              ItemsSource="Binding items" 
              AutoGenerateColumns="False">
        <DataGrid.Resources>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="Binding Name"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Visible" Visibility="Binding RelativeSource=RelativeSource AncestorType=DataGrid, Path=DataContext.ButtonIsVisible, Converter=StaticResource BoolTovisibilityConverter"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

确实,您在按钮可见性中看到了一种奇怪的绑定语法。这是为什么?我假设你不需要模型中的这个功能,所以我回到了 DataGrid 的 DataContext 以达到那个 DependencyProperty。我不完全确定您的情况,但我已经向您展示了一些易于使用的机制。

【讨论】:

以上是关于如何从 DataGridTemplateColumn.CellTemplate 访问按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

如何从 Firebase 获取所有设备令牌?

如何直接从类调用从接口继承的方法?

如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个

如何从Mac从android studio中的fabric注销? [复制]

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?