WPF टूलकिट का उपयोग करके एक स्वत: पूर्ण बॉक्स में एक कॉम्बो बॉक्स परिवर्तित करना

Aug 17 2020

"कॉम्प्लेक्स" कॉम्बोबॉक्स को समान रूप से जटिल ऑटोकंप्लीक्सबॉक्स में बदलने के लिए मुझे थोड़ी परेशानी हो रही है। मेरा लक्ष्य किसी सूची के आइटम की तरह होने के लिए शॉपिंगकार्ट के आइटम का चयन और सेट करने में सक्षम होना है। मेरी स्थिति को पुन: पेश करने के लिए तीन कदम उठाए गए हैं (मैं स्टाइललेट का उपयोग कर रहा हूं और इसके सेटअनॉटिफाई () INPC विधि) :

  1. दो ऑब्जेक्ट्स बनाएं, जिनमें से केवल एक नेम प्रॉपर्टी है और दूसरा एक प्रॉपर्टी के रूप में केवल दूसरी ऑब्जेक्ट है

    public class ItemModel : PropertyChangedBase
    {
        private string _name;
        public string Name
        {
            get => _name;
            set => SetAndNotify(ref _name, value);
        }
    }
    
    public class ShoppingCartModel : PropertyChangedBase
    {
        public ItemModel Item { get; set; }
    }
    
  2. प्रारंभ करें और दोनों DataLontext में ItemList और Shoppingcart को पॉप्युलेट करें (क्योंकि हम MVVM का उपयोग कर रहे हैं, यह ViewModel है)

    public ShoppingCartModel ShoppingCart { get; set; }
    public ObservableCollection<ItemModel> ItemsList { get; set; }
    
    public ShellViewModel()
    {
        ItemsList = new ObservableCollection<ItemModel>()
        {
            new ItemModel { Name = "T-shirt"},
            new ItemModel { Name = "Jean"},
            new ItemModel { Name = "Boots"},
            new ItemModel { Name = "Hat"},
            new ItemModel { Name = "Jacket"},
        };
    
        ShoppingCart = new ShoppingCartModel() { Item = new ItemModel() };
    }
    
  3. AutoCompleteBox, ComboBox, और इसे बाहर का परीक्षण करने के लिए व्यू के अंदर एक छोटा टेक्स्टब्लॉक बनाएं:

    <Window [...] xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=DotNetProjects.Input.Toolkit">
    
        <!-- Required Template to show the names of the Items in the ItemsList -->
        <Window.Resources>
            <DataTemplate x:Key="AutoCompleteBoxItemTemplate">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Background="Transparent">
                    <Label Content="{Binding Name}"/>
                </StackPanel>
            </DataTemplate>
        </Window.Resources>
    
        <StackPanel>
            <!-- AutoCompleteBox: can see the items list but selecting doesn't change ShoppingCart.Item.Name -->
            <Label Content="AutoCompleteBox with ShoppingCart.Item.Name as SelectedItem:"/>
            <toolkit:AutoCompleteBox ItemsSource="{Binding ItemsList}"
                                     ValueMemberPath="Name"
                                     SelectedItem="{Binding Path=ShoppingCart.Item.Name}" 
                                     ItemTemplate="{StaticResource AutoCompleteBoxItemTemplate}"/>
    
            <!-- ComboBox: can see the items list and selecting changes ShoppingCart.Item.Name value -->
            <Label Content="ComboBox with ShoppingCart.Item.Name as SelectedValue:"/>
            <ComboBox ItemsSource="{Binding ItemsList}" 
                      DisplayMemberPath="Name"
                      SelectedValue="{Binding Path=ShoppingCart.Item.Name}"
                      SelectedValuePath="Name"
                      SelectedIndex="{Binding Path=ShoppingCart.Item}" />
    
            <!-- TextBox: Typing "Jean" or "Jacket" updates the ComboBox, but not the AutoCompleteBox -->
            <Label Content="Value of ShoppingCart.Item.Name:"/>
            <TextBox Text="{Binding Path=ShoppingCart.Item.Name}"/>
        </StackPanel>
    </window>
    

स्वतः पूर्ण करने के लिए AutoCompleteBox के TwoIt में बाइंडिंग मोड को बदलना यह प्रिंट करता है " [ProjectName]। ItemModel " जिसका अर्थ है (मुझे लगता है!) यह आइटममॉडल और तार नहीं मिल रहा है, लेकिन मुझे यह काम करना प्रतीत हो रहा है। किसी भी मदद की सराहना की जाएगी, धन्यवाद और मेरी पोस्ट को संपादित करने के लिए स्वतंत्र महसूस करें यदि यह छोटा करना संभव है।

जवाब

Saliom Aug 21 2020 at 21:07

बहुत प्रयासों के बाद, आखिरकार मुझे अपराधी मिल गए:

  • INPC विरासत के ShoppingCartModel.Itemबावजूद लागू नहीं किया गया है (या तो INPC को लागू करने या विरासत के काम को हटाने के लिए)PropertyChangedBasePropertyChangedBase

    public class ShoppingCartModel : PropertyChangedBase
    {
        private ItemModel _item;
        public ItemModel Item
        {
            get => _item;
            set => SetAndNotify(ref _item, value);
        }
    }
    
  • AutoCompleteBox का SelectedItemएक ही प्रकार का होना चाहिए ItemsSource, और एक TwoWayमोड होना चाहिएBinding

    <toolkit:AutoCompleteBox ItemsSource="{Binding ItemsList}"
                             ValueMemberPath="Name"
                             SelectedItem="{Binding Path=ShoppingCart.Item, Mode=TwoWay}" 
                             ItemTemplate="{StaticResource AutoCompleteBoxItemTemplate}"/>
    
  • और अंत में ... सबसे रहस्यमय एक कॉम्बो बॉक्स है! बस वहाँ होने के साथ यह गड़बड़ करता है AutoCompleteBoxऔर मुझे पता नहीं क्यों, बस पूरे कॉम्बो बॉक्स पर टिप्पणी करना यह सब काम करता है। यदि आप जानते हैं कि क्यों ComboBox AutoCompleteBox के बंधन को मदद करने के लिए स्वतंत्र महसूस करता है।

हालाँकि, एक अन्य समस्या है, जब एक सूची दृश्य के अंदर AutoCompleteBox का उपयोग किया जाता है, लेकिन यहां उस मुद्दे के लिए एक अलग प्रश्न बनाना बेहतर है