Wie kann ich mein "Kontrollkästchen" -Olement finden, das sich in der ItemTemplate befindet?

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe das folgende (sehr einfache) itemscontrol:

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

In Code möchte ich Folgendes tun:

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

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

Wie mache ich das?

War es hilfreich?

Lösung

Erstens, nicht wenn Sie es vermeiden können. Es ist viel sauberer, die verschiedenen Eigenschaften der zu binden CheckBox Zu Ihrem Ansichtsmodell, anstatt sie manuell herauszuziehen.

Das heißt, wenn Sie zu Ihrem gelangen müssen CheckBox, Sie können in der Lage sein, einen solchen Code zu verwenden:

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

Andere Tipps

Ok, Kent bekommt den Kredit, aber es war nur meist Rechts :)

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

Aber ... der zweite Teil würde null zurückkehren, also musste es wie folgt sein:

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

Sein Code sah so aus, als ob er hätte funktionieren sollen, aber für meinen Fall musste ich dies stattdessen tun.

Hier ist ein Beispiel für die Erfassung eines Containers, in dem der Artikel Ihres SactiveControl untergebracht ist:

       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;
            }
        }

Ich hoffe das hilft.

Ich habe den Code verwendet, den Kent und Timothy lieferten, aber für mich wurde auch diese zusätzliche Zeile benötigt.

Der gesamte Code -Snippet geht:

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

Prost!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top