Come trovo il mio & # 8220; CheckBox & # 8221; articolo che si trova nel ItemTemplate?
-
03-07-2019 - |
Domanda
Ho i seguenti (molto semplici) ItemsControl:
<ItemsControl Name="BlahList" ItemsSource="{Binding Blah}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Name="MyCheckBox" Content="{Binding Text}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Nel codice, vorrei fare quanto segue:
foreach (var dahCurrentItem in BlahList.Items)
{
var ItemCheckBox = BlahList.GimmeMyControl(dahCurrentItem, "MyCheckBox")
// I'm going to do something with the check box here...
}
Come posso farlo?
Soluzione
In primo luogo, non se c'è un modo per evitarlo. È molto più semplice associare le varie proprietà di CheckBox
al modello di visualizzazione anziché cercare di estrarle manualmente.
Detto questo, se devi accedere al tuo CheckBox
, dovresti essere in grado di usare il codice in questo modo:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
var checkBox = container.FindName("MyCheckBox") as CheckBox;
Altri suggerimenti
OK, Kent ottiene il merito, ma era solo per lo più giusto :)
// This part was good:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
ma ... la seconda parte restituirebbe null, quindi doveva essere la seguente:
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;
Il suo codice sembrava che avrebbe dovuto funzionare, ma per il mio caso, ho dovuto farlo invece.
Ecco un esempio di acquisizione di un contenitore che ospita l'oggetto 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;
}
}
Spero che sia d'aiuto.
Ho usato il codice fornito da Kent e Timothy, ma questa riga aggiuntiva era necessaria anche per me.
L'intero snippet di codice è:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
container.ApplyTemplate()
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;
Cheers!