Come trovo il mio & # 8220; CheckBox & # 8221; articolo che si trova nel ItemTemplate?

StackOverflow https://stackoverflow.com/questions/603203

  •  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?

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top