2010-05-07 16 views
5

से जुड़ा हुआ है, मैं यह करना चाहता हूं कि मैं क्या करना चाहूंगा। मुझे डेटाबेस से वस्तुओं की एक सूची मिलती है और इस सूची को एक सूची बॉक्स नियंत्रण में बांधें। ListBoxItems में एक टेक्स्टबॉक्स और एक बटन शामिल है। यहां वह है जो मैंने जुटाया। इस बिंदु तक यह इरादे के रूप में काम करता है। ऑब्जेक्ट में आईडी, नाम जैसे कई गुण हैं। अगर मैं बटन ListBoxItem में आइटम डेटाबेस से ListBox से मिटा दिया जाना चाहिए और यह भी ...डब्ल्यूपीएफ - मैं एक ऑब्जेक्ट कैसे प्राप्त करूं जो ListBoxItem को

<ListBox x:Name="taglistBox">  
         <ListBox.ItemContainerStyle> 
          <Style TargetType="{x:Type ListBoxItem}"> 
           <Setter Property="HorizontalAlignment" Value="Stretch"/> 
           <Setter Property="Template"> 
            <Setter.Value> 
             <ControlTemplate TargetType="ListBoxItem"> 
              <ContentPresenter HorizontalAlignment="Stretch"/> 
             </ControlTemplate> 
            </Setter.Value> 
           </Setter> 
           <Setter Property="Tag" Value="{Binding TagSelf}"></Setter> 
          </Style> 
         </ListBox.ItemContainerStyle> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <Grid HorizontalAlignment="Stretch"> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition/> 
            </Grid.ColumnDefinitions> 
            <Button Grid.Column="0" Name="btTag" VerticalAlignment="Center" Click="btTag_Click" HorizontalAlignment="Left"> 
             <Image Width="16" Height="16" Source="/WpfApplication1;component/Resources/104.png"/> 
            </Button> 
            <TextBlock Name="tbtagBoxTagItem" Margin="5" Grid.Column="1" Text="{Binding Name}" VerticalAlignment="Center" />           
           </Grid> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 

Textblock.Text आपत्ति उठाने object.Name और ListBoxItem.Tag के लिए बाध्य है पर क्लिक करें। टैग्सल्फ (जो ऑब्जेक्ट की सिर्फ एक प्रति है)।

अब मेरे सवालों

  1. अगर मैं listboxItem में बटन पर क्लिक करें मैं listboxitem और वस्तु इसे वापस करने के लिए बाध्य कैसे मिलता है। डेटाबेस से ऑब्जेक्ट को हटाने के लिए मुझे इसे किसी भी तरह से पुनर्प्राप्त करना होगा। मैंने

    ListBoxItem lbi1 =
    (ListBoxItem) (taglistBox.ItemContainerGenerator.ContainerFromItem (taglistBox.Items.CurrentItem)) की तरह कुछ करने की कोशिश की; ऑब्जेक्टइन क्वेस्टियन टी = (ऑब्जेक्टइन क्वेस्टियन) lbi1.Tag;

  2. यदि आइटम्ससोर्स बदलता है तो सूची बॉक्स की सामग्री को स्वचालित रूप से अपडेट करने का कोई तरीका है? अभी मैं

    टैगलिस्टबॉक्स.इटेम्ससोर्स = शून्य से प्राप्त कर रहा हूं;
    टैगलिस्टबॉक्स.इटेम्ससोर्स = ऑब्जेक्टइन क्वेस्टियन;

मैं किसी भी मदद आप दे सकते हैं कि सराहना करेंगे: डी अग्रिम

तत्काल स्वत: परिवर्तन

देखने के लिए

उत्तर

35

प्रत्येक ListBoxItem डेटा बाउंड संग्रह में डेटाकॉन्टेक्स्ट के रूप में संबंधित आइटम होगा। और ListBoxItem.ItemTemplate में प्रत्येक नियंत्रण DataContext को विरासत में ले जाएगा। वस्तु पर क्लिक किया बटन के पीछे आप क्लिक ईवेंट हैंडलर में निम्न कर सकते हैं पाने के लिए:

MyClass item = (MyClass)(sender as Button).DataContext; 

डेटा स्रोत में परिवर्तन स्वचालित रूप से सूची बॉक्स के लिए अद्यतन करने के लिए, आप एक ObservableCollection उपयोग कर सकते हैं।

1

उपयोग ObservableCollection का उपयोग कर SelectedItem जाओ धन्यवाद DataContext

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var btn = sender as Button; 
    myListBox.SelectedItem = btn.DataContext; 
} 

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

1

प्रश्न 2: एक पर्यवेक्षण चयन का उपयोग करें। यह लागू करता है IotifyCollectionChanged ताकि संग्रहों को परिवर्तित करने के रूप में आइटम जोड़े और हटा दिए जाएंगे।

प्रश्न 1: प्रेषक को एक बटन के रूप में कास्ट करें और इसका डेटाकॉन्टेक्स्ट का उपयोग करें। यह वह आइटम होगा जो इसके लिए बाध्य है। यदि आपको ListBoxItem स्वयं भी प्राप्त करने की आवश्यकता है, तो आप पेड़ को खोजने के लिए VisualTreeHelper.GetParent() कर सकते हैं।

संबंधित मुद्दे