การคลิกที่ Databound ComboBoxItem จะไม่อัปเดต ComboBox หลัก

ฉันกำลังผูกพจนานุกรมกับ ComboBox ItemSource ทุกอย่างเชื่อมโยงอย่างถูกต้อง แต่เมื่อฉันรันโปรแกรม ให้คลิกที่เมนูแบบเลื่อนลง จากนั้นคลิกที่รายการ...ไม่มีอะไรเกิดขึ้น

ข้อมูลที่เป็นประโยชน์อื่นๆ เมื่อฉันคลิกข้อความของแต่ละรายการ ฉันจะเห็นกล่อง/ขอบจางๆ รอบๆ ข้อความ ถ้าฉันคลิกภายในกล่อง ก็ไม่มีอะไรเกิดขึ้น ถ้าฉันคลิกนอกกรอบ สิ่งต่างๆ ก็เป็นไปตามที่คาดไว้ ความคิด?

รหัส xaml ของฉัน:

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

และรหัสของฉันอยู่ข้างหลัง:

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

PayloadDrop.ItemsSource = PayloadDictionary

ด้านล่างนี้เป็นภาพหน้าจอของกล่องคำสั่งผสมของฉัน...

ภาพหน้าจอ


person Lucas Bailey    schedule 17.07.2015    source แหล่งที่มา
comment
แทนที่จะใช้ ItemContainerTemplate ให้ใช้ DataTemplate ไม่มีอะไรเกิดขึ้น คุณหมายความว่ารายการที่เลือกไม่แสดงใน ComboBox?   -  person Maximus    schedule 17.07.2015
comment
โดยไม่มีอะไรเกิดขึ้น ฉันหมายถึงว่า แท้จริงแล้วจะไม่มีอะไรเกิดขึ้น เหตุการณ์ onclick ของฉันจะไม่เริ่มทำงาน (ไม่แสดงในโค้ดด้านบน) รายการที่เลือกในกล่องคำสั่งผสมจะไม่เปลี่ยนเป็นรายการที่ฉันคลิก และกล่องแบบเลื่อนลงจะไม่ถูกซ่อนอีก โดยพื้นฐานแล้ว ภาพหน้าจอที่คุณเห็นด้านบนจะยังคงอยู่ตรงนั้น...เมื่อฉันเปลี่ยนโค้ดจาก ComboBoxItem เป็น TextBlock และแอตทริบิวต์ Content เป็น Text ทุกอย่างก็เริ่มทำงานได้อย่างสมบูรณ์   -  person Lucas Bailey    schedule 21.07.2015


คำตอบ (2)


ฉันไม่เคยมีประสบการณ์กับ ItemContainerTemplate มากนัก แต่เท่าที่ฉันเข้าใจ กรณีนี้จะเหมือนกันกับ DataTemplate (ไม่มีการกล่าวถึง Resources หรือ MenuBase หรือ StatusBar)

คุณมีคอลเลกชันของรายการ KeyValuePair เป็น ItemsSource KeyValuePair ไม่ใช่ ComboBoxItem ดังนั้น ComboBox จึงตัดสินใจสร้างคอนเทนเนอร์สำหรับมัน - ComboBoxItem คอนเทนเนอร์นี้ต้องการวิธีในการแสดงข้อมูลรายการ และคุณได้ตั้งค่า ItemTemplate สำหรับสิ่งนั้น ด้วยเหตุนี้ ComboBoxItem รายการอื่น จึงถูกสร้างขึ้นภายในคอนเทนเนอร์ ดังนั้น คุณมี ComboBoxItem อยู่ภายใน ComboBoxItem ComboBoxItem ภายนอกเชื่อมต่อกับ ComboBox ดังนั้น ComboBox จึงได้รับการคลิก ComboBoxItem ภายในจะแสดงโดยมีเส้นขอบจางๆ และถูกตัดการเชื่อมต่อ ดังนั้นจึงไม่มีการตอบสนองต่อเหตุการณ์การคลิก
มีสองวิธีที่เป็นไปได้ในการเปลี่ยน xaml ของคุณ: ใช้ DataTemplate ที่ถูกต้องสำหรับ ItemTemplate หรือสไตล์สำหรับ ItemContainerStyle ตามที่ฉันเข้าใจ งานของคุณคือการแสดงค่าแต่เก็บข้อมูลเกี่ยวกับคีย์ (ID บางชนิด) ไว้ด้วย ดังนั้นคุณควรใช้ DataTemplate ที่ถูกต้อง:

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

ในกรณีนี้ ComboBox จะแสดงเฉพาะค่าเท่านั้น คุณสามารถเข้าถึงได้ด้วยคุณสมบัติ SelectedValue คุณสมบัติ SelectedItem จะมี KeyValuePair พื้นฐาน เนื่องจาก KeyValuePair ไม่ได้ใช้ INotifyPropertyChanged จึงจำเป็นต้องใช้ Mode=OneTime เพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำ

person Aloraman    schedule 17.07.2015
comment
Uggg...การเปลี่ยนจากรายการคอมโบเป็นบล็อกข้อความช่วยแก้ไข...เสียเวลาไปมาก...ขอบคุณมาก ขอบคุณ @SamTheDev เช่นกัน แน่นอนว่าฉันไม่รู้ว่า Comboboxitem ถูกสร้างขึ้นโดยอัตโนมัติ... - person Lucas Bailey; 17.07.2015

คุณไม่จำเป็นต้องกำหนด ComboboxItem ภายใน DataTemplate เนื่องจากมันจะถูกสร้างขึ้นโดยปริยาย

<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