ItemTemplate에있는 "확인란"항목을 찾으려면 어떻게해야합니까?
-
03-07-2019 - |
문제
다음과 같은 (매우 간단한) 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...
}
어떻게해야하나요?
해결책
첫째, 피할 수있는 방법이 있다면 피할 수 없습니다. 다양한 속성을 바인딩하는 것이 훨씬 깨끗합니다. CheckBox
수동으로 꺼내려고하는 대신 뷰 모델에.
즉, 당신이 당신의 CheckBox
, 다음과 같은 코드를 사용할 수 있어야합니다.
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
var checkBox = container.FindName("MyCheckBox") as CheckBox;
다른 팁
좋아, 켄트는 신용을 얻지 만 주로 오른쪽 :)
// This part was good:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
그러나 ... 두 번째 부분은 null을 반환 할 것이므로 다음과 같아야했습니다.
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;
그의 코드는 그것이 효과가 있었던 것처럼 보였지만, 내 경우에는 대신 이것을해야했습니다.
다음은 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;
}
}
도움이되기를 바랍니다.
나는 Kent와 Timothy가 제공 한 코드를 사용했지만이 추가 라인도 필요했습니다.
전체 코드 스 니펫은 다음과 같습니다.
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
container.ApplyTemplate()
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;
건배!
제휴하지 않습니다 StackOverflow