“ CheckBox”を見つける方法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;
他のヒント
OK、ケントはクレジットを取得しますが、それはほとんどほとんどでした:)
// This part was good:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
しかし... 2番目の部分は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;
}
}
お役に立てば幸いです。
ケントとティモシーが提供したコードを使用しましたが、この追加行も必要でした。
コードスニペット全体:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
container.ApplyTemplate()
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;
乾杯!
所属していません StackOverflow