ทางเลือกแทน ElementName ใน x: ผูกด้วย DataTemplates

เมื่อใช้ไวยากรณ์ {Binding} แบบดั้งเดิม คุณสามารถระบุชื่อองค์ประกอบให้ชี้ไปที่ส่วนควบคุมเฉพาะบนเพจ และสามารถเข้าถึงคุณสมบัติขององค์ประกอบได้ ตัวอย่างเช่น หากเพจชื่อ page คุณสามารถทำได้:

{Binding ElementName=Page, Path=Name}

ด้วยไวยากรณ์ {x:Bind} มันบอกว่า

ด้วย x:Bind คุณไม่จำเป็นต้องใช้ ElementName=xxx เป็นส่วนหนึ่งของนิพจน์การโยง ด้วย x:Bind คุณสามารถใช้ชื่อขององค์ประกอบเป็นส่วนแรกของเส้นทางสำหรับการโยงได้ เนื่องจากองค์ประกอบที่มีชื่อจะกลายเป็นฟิลด์ภายในเพจหรือการควบคุมผู้ใช้ที่แสดงถึงแหล่งที่มาของการโยงรูต

ดังนั้นสำหรับตัวอย่างข้างต้นใน {x:Bind} จะเป็นดังนี้

{x:Bind page.Name}

ซึ่งทำงานได้ดีจนกระทั่งอยู่ภายในเทมเพลตข้อมูล (เช่น ItemTemplate ของ ListView) ซึ่งในกรณีนี้จะไม่ทำงานอีกต่อไปเนื่องจากกำลังมองหา Page ในประเภทข้อมูลที่ระบุ ซึ่งนำไปสู่ข้อผิดพลาดต่อไปนี้ (สมมติว่าประเภทข้อมูลของฉันคือ customer):

ข้อผิดพลาด XamlCompiler WMC1110: เส้นทางการเชื่อมโยงไม่ถูกต้อง 'Page.Name': ไม่พบคุณสมบัติ 'หน้า' ในประเภท 'ลูกค้า'

วิธีแก้ปัญหาในการใช้ไวยากรณ์ {x:Bind} กับเทมเพลตข้อมูลและการควบคุมการเข้าถึงภายนอกเทมเพลตข้อมูลคืออะไร

มีโค้ดตัวอย่างที่นี่ (หมายเหตุคอมมิตเฉพาะ)


person Robert MacLean    schedule 29.09.2015    source แหล่งที่มา


คำตอบ (1)


เท่าที่ฉันรู้ ณ จุดนี้ ไม่มีวิธีใดที่จะผูกเข้ากับคุณสมบัติของตัวควบคุมโดยตรงโดยใช้เมธอด x:bind เนื่องจากไม่รองรับชื่อองค์ประกอบภายในคำจำกัดความของการโยง

นั่นไม่ได้หมายความว่าคุณไม่สามารถผูกเข้ากับการควบคุมภายใน dataTemplate ได้ คุณยังสามารถทำสิ่งนี้เพื่อเข้าถึงการควบคุมได้ แต่คุณไม่สามารถใช้ไวยากรณ์ x:Bind ที่คอมไพล์แล้วได้

 <DataTemplate x:DataType="local:Customer">
     <StackPanel Orientation="Vertical">
         <Button Content="{Binding Name, ElementName=page}" />
         <TextBlock Text="{x:Bind Title}" />
     </StackPanel>        
 </DataTemplate>

สาเหตุของข้อผิดพลาดที่คุณได้รับนั้นเนื่องมาจากวิธีที่เทมเพลตข้อมูลเป็นผู้ปกครองแหล่งข้อมูลของตน การผูก x:Bind ไม่สามารถอ้างอิงวัตถุควบคุม และชนิดลูกค้าของคุณทำคุณสมบัติ Page.Name หรือเส้นทาง ดังที่แสดงไว้ข้างต้น วิธีเดียวที่แท้จริงในการเข้าถึงคุณสมบัติการควบคุมผู้ใช้ที่อยู่นอกการควบคุมของคุณโดยใช้ XAML เท่านั้นคือการกลับไปใช้กลไกการเชื่อมโยงมาตรฐาน

ฉันหวังว่านี้ตอบคำถามของคุณ.

person davemsdevsa    schedule 29.09.2015