【问题标题】:How to reference Checkbox which is defined in DataTemplate如何引用DataTemplate中定义的Checkbox
【发布时间】:2022-11-27 05:26:40
【问题描述】:

我有一个数据网格如下。我想在后面的代码中引用名为 ckbSelectedAll 的 CheckBox 。 WPF 不允许在后面的代码中引用名称。我应该走哪条路?

<DataGrid x:Name="deckGrid"  ItemsSource="{Binding DeckList}" AutoGenerateColumns="False" 
            SelectionMode="Single" Margin="10,10,0,0" SelectionUnit="FullRow" CanUserAddRows="False" IsReadOnly="True">

            <DataGrid.Columns >
                <DataGridTemplateColumn Width="70">
                    <DataGridTemplateColumn.HeaderTemplate >
                        <DataTemplate>
                                <CheckBox x:Name="ckbSelectedAll" IsThreeState="True" Margin="10,0,0,0" Checked="CheckBox_Checked" Unchecked="CheckBox_Checked">
                            </CheckBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.HeaderTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

【问题讨论】:

  • 模板就是模板。在将模板应用于某个元素之前,没有 CheckBox。你想做什么?为什么、何时何地需要以编程方式访问CheckBox

标签: c# wpf datagrid datatemplate


【解决方案1】:

我回答了一个关于使用 ListView 的 DataTemplate 访问按钮的类似问题。幸运的是,过程非常相似。在这里,我枚举了 ItemSource 中的每个 DataGrid 项目。我随机取消选中存储在列表中的几个项目。我从 Button_Click 处理项目,但在调用 InitializeComponent() 之后从 Window 构造函数执行它应该会产生相同的结果。

List<CheckBox> checkboxes =
    new List<CheckBox>();

private void Button_Click(object sender, RoutedEventArgs e)
{
    deckGrid.Items
        .Cast<dynamic>()
        .ToList()
        .ForEach(item => {
            var checkitem =                       
                   (deckGrid
                       .ItemContainerGenerator
                           .ContainerFromItem(item));

            CheckBox checkbox =
                FindVisualChild<CheckBox>
                    (checkitem);

            checkboxes
                .Add(checkbox);
        });

    checkboxes[1]
        .IsChecked = false;
    checkboxes[3]
        .IsChecked = false;
}

private childItem FindVisualChild<childItem>(DependencyObject obj)
    where childItem : DependencyObject
{
    for (int i = 0;
             i < VisualTreeHelper
                     .GetChildrenCount(obj);
                         i++)
    {
        DependencyObject child =
            VisualTreeHelper
                .GetChild(obj, i);

        if (child != null
               && child is childItem)
        {
            return
                (childItem)child;
        }
        else
        {
            childItem childOfChild =
                FindVisualChild<childItem>
                    (child);

            if (childOfChild != null)
                return
                    childOfChild;
        }
    }
    return null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多