简体   繁体   English

无法从DataGrid特定的单元格获取按钮实例

[英]Unable to get button instance from DataGrid specific Cell

Below is the .xaml code. 下面是.xaml代码。 i can get value of Status column and in next step i have to show/hide btnCancel button. 我可以获取“状态”列的值,并且在下一步中,我必须显示/隐藏btnCancel按钮。

    <DataGrid x:Name="grdUnConfirmJobs"  HeadersVisibility="None" IsReadOnly="True" HorizontalScrollBarVisibility="Disabled" MouseDoubleClick="grdUnConfirmJobs_MouseDoubleClick" AutoGenerateColumns="False" Background="White" >
    <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Ref}" IsReadOnly="True" Visibility="Visible" Width="60"  />
    <DataGridTextColumn Binding="{Binding Time}" IsReadOnly="True" Visibility="Visible"  Width="35" />
    <DataGridTextColumn Binding="{Binding PickUp}" IsReadOnly="True" Visibility="Visible" Width="250"  />
    <DataGridTextColumn Binding="{Binding Destination}" IsReadOnly="True" Visibility="Visible"  Width="180" />
    <DataGridTextColumn Binding="{Binding Status}" IsReadOnly="True" Visibility="Visible"  Width="40" />    
    <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" Visibility="Visible" />
                </StackPanel>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

I can read the Status column's values as below but could not get the btnCancel object to show/hide. 我可以读取“状态”列的值,如下所示,但无法显示/隐藏btnCancel对象。 Please anybody suggest what should I do. 请任何人建议我该怎么办。

    using (CabeeLocalDataContext db = new CabeeLocalDataContext())
    {

    var unCnfJobs = db.sp_ProcessingJobs(CurrentDateTime).ToList();
    grdUnConfirmJobs.ItemsSource = unCnfJobs;
    }

    grdUnConfirmJobs.UpdateLayout();

    foreach (sp_ProcessingJobsResult item in grdUnConfirmJobs.ItemsSource)
    {
    if (item.Status == "Cancellation Requested")
    {

    }

    }

As far as i know you can't access controls by name when they are defined in DataTemplates. 据我所知,当您在DataTemplates中定义控件时,您无法按名称访问控件。 In order to change that button Visibility you have to use binding. 为了更改该按钮的可见性,您必须使用绑定。 I've made a simple example for this: 我为此做了一个简单的例子:

<Window x:Class="VisibilityStack.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:converters="clr-namespace:VisibilityStack"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.Resources>
        <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
    </Grid.Resources>
    <StackPanel>
        <Button Content="Testing Visibility" 
                Visibility="{Binding IsChecked, Converter={StaticResource BoolToVisibilityConverter}}"/>
        <CheckBox IsChecked="{Binding IsChecked}"/>
    </StackPanel>
</Grid>

Here is your codebehind with the DependencyProperty IsChecked which will be used for bindings. 这是您的代码,其中包含DependencyProperty IsChecked,该代码将用于绑定。 When the CheckBox will be checked, you will see the button, otherwise it's Visibility will be Hidden according to the below converter: 选中CheckBox时,您将看到该按钮,否则根据以下转换器,其可见性将被隐藏:

public partial class MainWindow : Window
{
    public bool IsChecked
    {
        get { return (bool)GetValue(IsCheckedProperty); }
        set { SetValue(IsCheckedProperty, value); }
    }

    // Using a DependencyProperty as the backing store for IsChecked.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsCheckedProperty =
        DependencyProperty.Register("IsChecked", typeof(bool), typeof(MainWindow), new PropertyMetadata(false));


    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }
}

And the converter: 和转换器:

public class BoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
    {
        bool val = (bool)value;

        return val ?
          Visibility.Visible : Visibility.Hidden;
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

So, in your codebehind, if according to your business logic you need the button to be Hidden, or Visible just change that IsChecked property to true or false and the converter will do the job for you, transforming the booleans into items of the Visibility enumeration. 因此,在后面的代码中,如果根据您的业务逻辑,您需要隐藏按钮或“可见”按钮,只需将IsChecked属性更改为true或false即可,转换器将为您完成此工作,将布尔值转换为Visibility枚举项。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM