locked
Silverlight Data FAQ: วิธีแก้ปัญหาคุณสมบัติของ data binding ใน WPF ที่ยังไม่รองรับใน Silverlight RRS feed

คำตอบ



  • คุณสมบัติของ data binding ต่อไปนี้ยังไม่รองรับใน Silverlight





         
      • Elementto element binding



    วิธีแก้ปัญหา: Silverlight3 จะรองรับคุณสมบัตินี้





         
      • UpdateSourceTrigger



    วิธีแก้ปัญหา: Silverlight3 จะรองรับคุณสมบัตินี้





         
      • CollectionViewSource



    วิธีแก้ปัญหา: ทำการ sort, filter, และอื่นๆ ใน data sourceหรือถ้าต้องการ protect original data source จะต้องทำการ
    copy





         
      • Datavalidation



    วิธีแก้ปัญหา: Silverlight3 จะรองรับคุณสมบัตินี้





         
      • DataTemplateSelector



    วิธีแก้ปัญหา:



    สมมติว่ามี ListBox ดังต่อไปนี้:




    <ListBox x:Name="lb">



    <ListBox.ItemTemplate>



    <DataTemplate>



    <StackPanel>



    <TextBlock
    Text
    ="{Binding
    Name
    }"/>



    <TextBlock
    Text
    ="{Binding
    Age
    }"/>



    </StackPanel>



    </DataTemplate>



    </ListBox.ItemTemplate>


    </ListBox>



    ถ้าต้องการแสดง foreground ที่ไม่เหมือนกัน โดยให้ขึ้นกับค่าของอายุ

    ในกรณีนี้ เราจะ
    bind Foreground ของ TextBlock ให้เป็น Age property ด้วย converter

    แต่ถ้าเราต้องการแสดงเนื้อหาที่แตกต่างกันมากๆ ตามค่าของอายุ วิธีนี้เราจะต้องเขียนโค้ดเยอะมาก
    ซึ่งใน
    WPF เราสามารถใช้ DataTemplateSelector เพื่อหลีกเลี่ยงการเขียนโค้ดได้ และสำหรับ Silverlight ที่ไม่มี DataTemplateSelector เราจะใช้วิธีแก้ปัญหาที่คล้ายกันกับวิธีการนี้ คือ:



    สร้าง DataTemplates ขึ้นมา 2 อัน:



    <DataTemplate x:Key="dt1">



    <StackPanel>



    <TextBlock
    Foreground
    ="Red"
    Text
    ="{Binding
    Name
    }"/>



    <TextBlock
    Foreground
    ="Red"
    Text
    ="{Binding
    Age
    }"/>



    </StackPanel>



    </DataTemplate>



    <DataTemplate x:Key="dt2">



    <StackPanel>



    <TextBlock
    Foreground
    ="Blue"
    Text
    ="{Binding
    Name
    }"/>



    <TextBlock
    Foreground
    ="Blue"
    Text
    ="{Binding
    Age
    }"/>



    </StackPanel>


    </DataTemplate>



    และปรับเปลี่ยน ListBox ให้เป็นดังนี้:




    <ListBox x:Name="lb">



    <ListBox.ItemTemplate>



    <DataTemplate>



    <ContentControl
    Content
    ="{Binding}"
    Loaded
    ="ContentControl_Loaded"/>



    </DataTemplate>



    </ListBox.ItemTemplate>


    </ListBox>



    หมายเหตุ
    Content=”{Binding}”

    DataContext จะไม่ส่งค่าไปยัง ContentTemplate ของ ContentControl



    และตอนนี้เราก็สามารถกำหนดค่าของ ContentTemplates ที่แตกต่างกันได้ใน ContentControl ตาม data source ที่ต้องการ ดังต่อไปนี้:



    privatevoid
    ContentControl_Loaded(object sender,RoutedEventArgs e)



    {



    ContentControl cc = (ContentControl)sender;



    Data d = (Data)cc.DataContext;



    if (d.Age > 20)



    {



    cc.ContentTemplate = (DataTemplate)this.Resources["dt1"];



    }



    else



    {



    cc.ContentTemplate = (DataTemplate)this.Resources["dt2"];



    }

    }




      • ไม่รองรับ binding to xml โดยตรง



    วิธีแก้ปัญหา: ต้องใข้ LINQ to XML เพื่อสร้าง CLR object data source





         
      • ไม่สามารถ bind กับ method ได้



    วิธีแก้ปัญหา: ยังไม่รองรับ





         
      • Bindingsource เป็นแค่FrameworkElement ยังไม่ใช่arbitrary DependencyObject



    วิธีแก้ปัญหา: ยังไม่รองรับ



    Supa Sethasiripong [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • ทำเครื่องหมายเป็นคำตอบโดย supa_sModerator 16 กุมภาพันธ์ 2555 2:07
    15 กุมภาพันธ์ 2555 7:47
    ผู้ดูแล