كيف يمكنني العثور على عنصر "مربع الاختيار" الخاص بي الموجود في itemTemplate؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

لدي العناصر التالية (بسيطة للغاية)

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

لكن ... الجزء الثاني سيعود فارغًا ، لذلك كان يجب أن يكون كما يلي:

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

بدا رمزه أنه كان ينبغي أن ينجح ، لكن بالنسبة لحالتي ، كان علي أن أفعل ذلك بدلاً من ذلك.

إليك مثال على التقاط حاوية تضم عنصر العناصر الخاصة بك:

       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;

هتافات!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top