如何找到位于ItemTemplate中的“CheckBox”项?

26

我有一个非常简单的ItemsControl:

<ItemsControl Name="BlahList" ItemsSource="{Binding Blah}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Name="MyCheckBox" Content="{Binding Text}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

在代码中,我想要做以下操作:

foreach (var dahCurrentItem in BlahList.Items)
{
    var ItemCheckBox = BlahList.GimmeMyControl(dahCurrentItem, "MyCheckBox")

    // I'm going to do something with the check box here...
}

我该如何做到这一点?

4个回答

29

好的,肯特得到了认可,但它只是大部分正确 :)

// This part was good:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;

但是...第二个部分会返回null,因此必须按照以下方式:

var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;

他的代码看起来应该能够工作,但在我的情况下,我必须使用这个替代方案。


1
我在ItemTemplate上没有FindName方法(还有似乎某处多了一个 - J4N

19

首先,如果有任何避免的方式,请不要这样做。将 CheckBox 的各种属性绑定到视图模型中比手动提取它们更加简洁。

话虽如此,如果需要访问 CheckBox,您应该能够使用以下代码:

var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
var checkBox = container.FindName("MyCheckBox") as CheckBox;

先生,您真美! - 我同意您的说法,但在这种情况下,我正在执行“全选”和“全不选”类型的函数...我意识到我可以将“isChecked”绑定到某个数组,然后重新更新绑定...但只是循环检查更懒惰...我的意思是...更容易 :) 再次感谢! - Timothy Khouri
2
好的,我必须取消“已回答”复选框……因为我只得到了“NULL”。我想这非常接近,但肯定有一些小问题。 - Timothy Khouri
在执行FindName操作时,最终该如何处理才能避免返回null? - J4N

0
这是一个捕获包含您的ItemsControl项目的容器的示例:
       CheckBox checkbox = sender as CheckBox;

        foreach (var item in MembersItemsControl.Items)
        {
            var container = 
MembersItemsControl.ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement;

            UserInformation user = container.DataContext as UserInformation;

            bool isMale = true;
            if (user.sex == isMale && checkbox.IsChecked.Value == true)
            {
                container.Visibility = System.Windows.Visibility.Visible;
            }
        }

希望这能有所帮助。


0

我使用了Kent和Timothy提供的代码,但是对于我来说还需要这一行额外的代码。

整个代码片段如下:

var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
container.ApplyTemplate()
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;

干杯!


我重新构思了答案,使其不像一个问题。我只想添加之前答案中没有的那一行。另外,正如你所说,我没有足够的声望来发表评论... - mZm
答案必须独立,并且不依赖于其他答案。 - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接