2010-08-19 43 views
9

我的主要問題是關於綁定大小寫的情況下,我們有一個控件(數據網格內的組合框)(或同時具有datacontext和itemssource)多個來源。那麼我們如何知道綁定將使用哪個源? (任何語法來澄清)ItemsSource與DataContext綁定的情況下

假設一個數據網格有一個itemssource =「球員列表」datacontext =「經理」 ,並有一個組合框作爲一種列。我們還假定每個玩家都有一個庫存屬性,這是一個集合類型。

則datagrid.columns內:

  1. 每列(結合)的電流源是一個播放器(這是我的理解它爲止)。我們只能綁定到玩家的屬性而不是datacontext「manager」的屬性。沒有辦法綁定到「經理」的財產。我對麼?但是,如果我們移動到組合框列,那麼假設我將讓組合框的itemssource ='player'的庫存',那麼comboboxItem的當前源將是庫存中的每個項目。如果我使用綁定,它只能綁定到這些項目的屬性。 但是,有時我會看到代碼,我們也可以綁定到組合框內的播放器屬性,特別是Selected Value和SelectedItem。我在這裏有點困惑 你能幫我嗎?

謝謝

回答

8

關鍵控制想想是ItemsControl(從ItemsControlComboBox繼承和DataGrid行爲非常相似)。

ItemsControlItemsSource類型IEnumerable的財產。它還具有屬性ItemTemplate屬性。它會做什麼是創建它的一個副本ItemTemplate爲每個項目在ItemsSourceItemTemplateDataContext將是ItemsSource中的每個項目。

對於您的情況ComboBoxDataGrid的列中的DataContext將是您的Player對象。如果您將ComboBoxItemSource綁定到Player的廣告資源,那麼您將在您的ComboBox的列表中獲得每件商品。
需要注意的是ComboBox本身的DataContext本身沒有變化。它仍然是Player對象。如果您爲ComboBox指定ItemTemplate,那麼的庫存中的物品就是DataContext

+0

對於SelectedValue SelectedItem,如果我們有綁定,那麼它將綁定到組合框的datacontext屬性(而不是組合框的itemssource中每個項目的屬性)。所以它是播放器的屬性,現在是組合框的數據上下文 對於SelectedValuePath,DisplayMemberPath:我們不使用標記語法將值分配給它們,因此它基本上沒有綁定。這就是爲什麼我們仍然可以在itemssource中分配項目屬性的名稱(而不是datacontext的屬性)。我對嗎? – Tai 2010-08-19 22:08:23

6

它非常簡單。

DataContext引用項目的相同屬性。它沒有得到擴展,也沒有動態。 DataContext適用於當前位於父級內的子級屬性。

但是ItemsSource是動態的。它隨着源代碼而延伸。這是一個例子。

這是一個示例xaml。

<UserControl x:Class="SilverlightApplication" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400"> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.Resources>   
     <DataTemplate x:Key="template2"> 
      <StackPanel Orientation="Horizontal"> 
       <Image x:Name="img1" Source="{Binding Image}"></Image> 
       <TextBlock x:Name="data2" Text="{Binding Data}"></TextBlock> 
      </StackPanel> 
     </DataTemplate> 
    </Grid.Resources> 
    <StackPanel> 
     <StackPanel x:Name="DataContextStack" Orientation="Vertical"> 
      <TextBlock x:Name="data1" Text="{Binding Text1}"></TextBlock> 
      <TextBlock x:Name="data2" Text="{Binding Text2}"></TextBlock> 
     </StackPanel> 
     <ListBox x:Name="lst2" ItemTemplate="{StaticResource template2}"></ListBox> 
    </StackPanel> 
</Grid> 

這裏是後面的代碼。

namespace SilverlightApplication 
{ 
    public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
     loadLists(); 
    } 

    private void loadLists() 
    { 
     ObservableCollection<Temp2> tColl = new ObservableCollection<Temp2>();    

     Temp1 t1 = new Temp1(); 
     t1.Text1 = "DataContext1"; 
     t1.Text2 = "DataContext2";    

     tColl.Add(new Temp2() { Image = "", Data = "Item1" }); 
     tColl.Add(new Temp2() { Image = "", Data = "Item2" }); 


     DataContextStack.DataContext = t1; 
     lst2.ItemsSource = tColl;    
    } 
} 

public class Temp1 
{ 
    public string Text1 { get; set; } 
    public string Text2 { get; set; } 



} 

public class Temp2 
{ 
    public string Image { get; set; } 
    public string Data { get; set; } 
} 
} 

正如你所看到的,在DataContext適用於哪些存在的StackPanel中和是指一個單獨的屬性,該屬性是文本的的TextBlocks。

而ItemsSource指的是Textblock的Image和Text屬性的來源,並且列表中的項目可以與ObservableCollection一起擴展。

或者讓它變得更簡單。

DataContext - 根據設計設置值。 ItemsSource - 根據邏輯設置值。

希望這會有所幫助。

將此標記爲答案,如果這回答了您的問題。

+0

嗨Aswin,謝謝你的幫助。我理解你的例子,但我想問的是同一控件(datagrid與combobox列內的情況下)同時具有itemssource和datacontext的情況。我認爲斯蒂芬的回答清除了我大部分的困惑。 你的答案也是有幫助的。謝謝 – Tai 2010-08-20 19:10:30

+0

它也是一樣的。如果你有一個帶有兩個文本塊的列表框,就像我在示例中所說的那樣。您可以使用DataContext來綁定數據。如果它的子控件有不同的控件,那麼使用ItemsSource將是最好的選擇。兩者都是在不同情況下使用的DataBinding現象。 – 2010-08-20 22:03:36

相關問題