wpf - एक ListBoxItem का चयन करते समय इसके आंतरिक ComboBox केंद्रित है




xaml datatemplate (2)

मेरे पास डेटाटाम्प्लेट है जो एक templated ListBoxItem होगा, इस DataTemplate में एक कॉम्बोबॉक्स है, जिस पर जब यह फोकस होता है मैं सूचीबॉक्सीइटम चाहता हूं कि यह टेम्पलेट चयनित होने का प्रतिनिधित्व करता है, यह मेरे लिए सही दिखता है लेकिन दुख की बात है कि यह पर्याप्त नहीं है = (

तो यहां असली प्रश्न एक ListBoxItem.IsSelected भीतर है, यह ListBoxItem.IsSelected के मूल्य को प्राप्त करना या सेट करना संभव है। क्या एक ListBoxItem.IsSelected माध्यम से ListBoxItem.IsSelected संपत्ति है?

<DataTemplate x:Key="myDataTemplate" 
              DataType="{x:Type local:myTemplateItem}">

 <Grid x:Name="_LayoutRoot">
     <ComboBox x:Name="testComboBox" />
 </Grid>

 <DataTemplate.Triggers>
     <Trigger Property="IsFocused" value="true" SourceName="testComboBox">
         <Setter Property="ListBoxItem.IsSelected" Value="true" />
     </Trigger>
 </DataTemplate.Triggers>

</DataTemplate>

<ListBox ItemTemplate="{StaticResource myDataTemplate}" />

पता नहीं क्यों आपका ट्रिगर काम नहीं करता कॉम्बो बॉक्स (या सूची बॉक्स आइटम के अंदर कोई नियंत्रण) की फोकस इवेंट को पकड़ने के लिए आप जुड़ी हुई रूट इवेंट्स का उपयोग कर सकते हैं। यदि आपको अपने आवेदन के अन्य हिस्सों में इस व्यवहार की आवश्यकता है तो आप कोड को व्युत्पन्न सूचीबॉक्से में भी डाल सकते हैं।

XAML:

<Window x:Class="RoutedEventDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Specialized="clr-namespace:System.Collections.Specialized;assembly=System"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    Height="300" Width="300">

    <Window.Resources>

        <DataTemplate x:Key="myDataTemplate">
            <Grid>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding}" Margin="5,0"/>
                    <ComboBox Width="50">
                        <ComboBoxItem>AAA</ComboBoxItem>
                        <ComboBoxItem>BBB</ComboBoxItem>
                    </ComboBox>
                </StackPanel>
            </Grid>
        </DataTemplate>

    </Window.Resources>

    <Grid>

        <ListBox ItemTemplate="{StaticResource myDataTemplate}">
            <ListBox.ItemsSource>
                <Specialized:StringCollection>
                    <System:String>Item 1</System:String>
                    <System:String>Item 2</System:String>
                    <System:String>Item 3</System:String> 
                </Specialized:StringCollection>
            </ListBox.ItemsSource>
        </ListBox>

    </Grid>
</Window>

सभी के लिए hooking के पीछे कोड ध्यान केंद्रित घटनाओं मिला

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace RoutedEventDemo
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            EventManager.RegisterClassHandler(typeof(UIElement),
                                              GotFocusEvent,
                                              new RoutedEventHandler(OnGotFocus));
        }

        private static void OnGotFocus(object sender, RoutedEventArgs e)
        {
            // Check if element that got focus is contained by a listboxitem and
            // in that case selected the listboxitem.

            DependencyObject parent = e.OriginalSource as DependencyObject;
            while (parent != null)
            {
                ListBoxItem clickedOnItem = parent as ListBoxItem;
                if (clickedOnItem != null)
                {
                    clickedOnItem.IsSelected = true;
                    return;
                }

                parent = VisualTreeHelper.GetParent(parent);
            }
        }
    }
}

मुझे आपकी समस्या का एक समाधान मिला

समस्या यह है कि जब आपके पास अपनी सूचीबॉक्सेम पर नियंत्रण होता है, और नियंत्रण क्लिक किया जाता है (जैसे टेक्स्ट इनपुट करने या कन्बोबोक्स के मान को बदलने के लिए), तो ListBoxItem का चयन नहीं किया जाता है।

यह काम करना चाहिए:

public class FocusableListBox : ListBox
{
    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return (item is FocusableListBoxItem);
    }

    protected override System.Windows.DependencyObject GetContainerForItemOverride()
    {
        return new FocusableListBoxItem();
    }
}

-> WPF के डिफ़ॉल्ट ListBox के स्थान पर इस फोकसबल लिस्टबॉक्स का उपयोग करें

और इस ListBoxItem का उपयोग करें:

public class FocusableListBoxItem : ListBoxItem
{
    public FocusableListBoxItem()
    {
        GotFocus += new RoutedEventHandler(FocusableListBoxItem_GotFocus);
    }


    void FocusableListBoxItem_GotFocus(object sender, RoutedEventArgs e)
    {
        object obj = ParentListBox.ItemContainerGenerator.ItemFromContainer(this);
        ParentListBox.SelectedItem = obj;
    }

    private ListBox ParentListBox
    {
        get
        {
            return (ItemsControl.ItemsControlFromItemContainer(this) as ListBox);
        }
    }

}

Treeview में भी यह समस्या है, लेकिन यह समाधान Treeview लिए काम नहीं करता है, क्योंकि कारण Treeview SelectedItem readonly । तो अगर आप मुझे Treeview कृपया मदद कर सकते हैं ;-)