Mengklik ComboBoxItem yang terikat data tidak memperbarui ComboBox induk

Saya mengikat kamus ke ComboBox ItemSource. Semuanya terikat dengan benar, namun ketika saya menjalankan program, klik pada drop down, lalu klik pada item tersebut...tidak ada yang terjadi.

Informasi berguna lainnya, ketika saya mengklik teks setiap item, saya dapat melihat kotak/batas samar di sekitar teks. Jika saya mengklik di dalam kotak, tidak terjadi apa-apa. Jika saya mengklik di luar kotak, semuanya berjalan sesuai harapan. Pikiran?

Kode xaml saya:

<ComboBox Name="PayloadDrop">
   <ComboBox.ItemTemplate>
      <ItemContainerTemplate>
         <ComboBoxItem Tag="{Binding Path=Key}" 
             Content="{Binding Path=Value}" />
         </ItemContainerTemplate>
      </ComboBox.ItemTemplate>
</ComboBox>

Dan kode saya di belakang:

Dim PayloadDictionary As New Dictionary(Of Int16, String) From _
        {{0, "Some payload text"}, {1, "Path to a payload file"}}

PayloadDrop.ItemsSource = PayloadDictionary

Di bawah ini adalah tangkapan layar dari tampilan kotak kombo saya...

tangkapan layar


person Lucas Bailey    schedule 17.07.2015    source sumber
comment
Alih-alih ItemContainerTemplate gunakan DataTemplate. Tidak terjadi apa-apa maksudnya item yang dipilih tidak ditampilkan di ComboBox?   -  person Maximus    schedule 17.07.2015
comment
Yang saya maksud dengan Tidak terjadi apa-apa adalah, secara harafiah, tidak akan terjadi apa-apa. Tak satu pun dari peristiwa onclick saya akan diaktifkan (tidak ditampilkan dalam kode di atas), item yang dipilih kotak kombo tidak akan berubah menjadi item yang saya klik, dan kotak drop down tidak akan disembunyikan lagi. Pada dasarnya, tangkapan layar yang Anda lihat di atas hanya akan tetap di sana...Setelah saya mengubah kode saya dari ComboBoxItem menjadi TextBlock dan atribut Content menjadi Text, semuanya mulai bekerja dengan sempurna.   -  person Lucas Bailey    schedule 21.07.2015


Jawaban (2)


Saya tidak pernah memiliki banyak pengalaman dengan ItemContainerTemplate, tetapi sejauh yang saya mengerti, kasusnya akan sama dengan DataTemplate. (Tidak disebutkan Sumber Daya atau MenuBase atau StatusBar)

Anda memiliki koleksi item KeyValuePair sebagai ItemsSource. KeyValuePair bukan ComboBoxItem, jadi ComboBox memutuskan untuk membuat wadah untuknya - ComboBoxItem. Penampung ini memerlukan cara untuk menampilkan data item, dan Anda telah menyetel ItemTemplate untuk itu, sebagai hasilnya yang lain ComboBoxItem dibuat di dalam penampung. Jadi, Anda memiliki ComboBoxItem di dalam ComboBoxItem. ComboBoxItem eksternal terhubung dengan ComboBox, sehingga ComboBox menerima klik. ComboBoxItem internal ditampilkan dengan batas samar dan terputus, sehingga tidak ada reaksi terhadap peristiwa klik.
Ada dua kemungkinan cara untuk mengubah xaml Anda: gunakan DataTemplate yang benar untuk ItemTemplate, atau Gaya untuk ItemContainerStyle. Seperti yang saya pahami, tugas Anda adalah menampilkan Nilai tetapi juga menyimpan informasi tentang Kunci (semacam ID), jadi Anda harus menggunakan DataTemplate yang benar:

<ComboBox x:Name="PayloadDrop">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Value, Mode=OneTime}"/>
                </DataTemplate>
            </ComboBox.ItemTemplate>
</ComboBox>

Dalam hal ini ComboBox hanya akan menampilkan nilai. Anda dapat mengaksesnya dengan properti SelectedValue. Properti SelectedItem akan berisi KeyValuePair yang mendasarinya. Karena KeyValuePair tidak mengimplementasikan INotifyPropertyChanged, penting untuk menggunakan Mode=OneTime untuk menghindari kebocoran memori.

person Aloraman    schedule 17.07.2015
comment
Uggg...Mengubahnya dari item kombo menjadi blok teks memperbaikinya...banyak waktu yang terbuang...Terima kasih banyak. Terima kasih juga kepada @SamTheDev. Jelas saya tidak menyadari item kombo itu dibuat secara otomatis... - person Lucas Bailey; 17.07.2015

Anda tidak perlu mendefinisikan ComboboxItem di dalam DataTemplate, karena itu akan dibuat secara implisit

<ComboBox Name="PayloadDrop" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Tag="{Binding Path=Key}" Padding="0" Margin="0"
         Text="{Binding Path=Value}" >                       
                </TextBlock>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
person SamTh3D3v    schedule 17.07.2015