Как определить, какой элемент дважды щелкнул внутри ListBox?


1 принят
+50

Вы можете использовать FrameworkTemplate.FindName Method (String,?FrameworkElement)для этой цели, и он должен работать так, как вы хотите:

private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is childItem)
            return (childItem)child;
        childItem childOfChild = FindVisualChild<childItem>(child);
        if (childOfChild != null)
            return childOfChild;
    }
    return null;
}

Затем:

private void LstBox_OnPreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    ListBoxItem ListBoxItem = (ListBoxItem)(lstBox.ItemContainerGenerator.ContainerFromIndex(lstBox.SelectedIndex));
    ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(ListBoxItem);
    DataTemplate myDataTemplate = contentPresenter.ContentTemplate;
    StackPanel temp = (StackPanel)myDataTemplate.FindName("myStackPanel", contentPresenter);
    //*so as to do some further operations like make the textbox editable and so on* as you want
   (temp.FindName("field1TextBox") as TextBox).IsReadOnly = false;
}

Основываясь на вашем вопросе, который вы сказали: « listboxОн DataTemplateсостоит из немногих TextBlockи некоторыхTextBoxes . (Я предположил, что они находятся внутри a StackPanel)

С # ,. сеть, МОФ, ListBox,

c#,.net,wpf,listbox,

2

Ответов: 1


1 принят
+50

Вы можете использовать FrameworkTemplate.FindName Method (String,?FrameworkElement)для этой цели, и он должен работать так, как вы хотите:

private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is childItem)
            return (childItem)child;
        childItem childOfChild = FindVisualChild<childItem>(child);
        if (childOfChild != null)
            return childOfChild;
    }
    return null;
}

Затем:

private void LstBox_OnPreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    ListBoxItem ListBoxItem = (ListBoxItem)(lstBox.ItemContainerGenerator.ContainerFromIndex(lstBox.SelectedIndex));
    ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(ListBoxItem);
    DataTemplate myDataTemplate = contentPresenter.ContentTemplate;
    StackPanel temp = (StackPanel)myDataTemplate.FindName("myStackPanel", contentPresenter);
    //*so as to do some further operations like make the textbox editable and so on* as you want
   (temp.FindName("field1TextBox") as TextBox).IsReadOnly = false;
}

Основываясь на вашем вопросе, который вы сказали: « listboxОн DataTemplateсостоит из немногих TextBlockи некоторыхTextBoxes . (Я предположил, что они находятся внутри a StackPanel)

С # ,. сеть, МОФ, ListBox,
Похожие вопросы