2011-07-27 67 views
3

我基本上想要在一個集合中取一堆名字並將它們綁定到一個組合框。例如:如何將字符串的「列表」綁定到WPF中的組合框?

  • 比爾
  • 傑克
  • 鮑勃
  • 凱文

,並有收集這些物品,並把它綁定到ComboBox。我不確定列表是否會動態更新,但我更喜歡計劃它。任何幫助,將不勝感激。我一直在嘗試幾個小時,但無法弄清楚。我想在XAML中做,而不是代碼隱藏。在代碼隱藏中,

MyComboBox.ItemsSource = MyObservableCollection; 

工作正常。我不知道如何在XAML中做到這一點,儘管在代碼隱藏中聲明瞭集合。

再次感謝(再次)社區。

*編輯:

這是多麼我已經收集聲明和訪問。

public ObservableCollection<string> propertynames 
    { 
     get {return _propertynames;} 
    } 
    private ObservableCollection<string> _propertynames; 

我想的最後一件事是這樣的:

<Window.Resources>  
    <CollectionViewSource Source="{Binding propertynames}" x:Key="srcSort"/> 
</Window.Resources> 
.... 
    <ComboBox x:Name="cboSort" HorizontalAlignment="Left" VerticalAlignment="Top" 
       Width="256" Background="WhiteSmoke" Margin="12,50,0,0" FontSize="12pt" 
       Height="27.28" 
       SelectedIndex="0" 
       SelectionChanged="cboWorkCenters_SelectionChanged" 
       ItemsSource="{Binding Path = {StaticResource srcSort}}"> 
    </ComboBox> 
.... 

我總的n00b這種東西。現在已經有一週左右的時間了,所以我可能對一位經驗豐富的用戶做了一些非常明顯的事情。

*編輯#2

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:s="clr-namespace:WpfApplication1" 
    Title="Window1" Height="226" Width="242" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}"> 

    <Grid> 
     <ComboBox Margin="43,71,40,77" 
        Name="comboBox1" 
        ItemsSource="{Binding ob}" /> 
    </Grid> 
</Window> 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public ObservableCollection<string> ob 
     { 
      get 
      { 
       return _ob; 
      } 
     } 
     private ObservableCollection<string> _ob = new ObservableCollection<string>(); 

     public Window1() 
     { 
      InitializeComponent(); 
      FillObj(); 
      //comboBox1.ItemsSource = ob; 
     } 

     private void FillObj() 
     { 
      for (int i = 1; i < 6; i++) 
      { 
       _ob.Add(i.ToString()); 
      } 
     } 
    } 
} 

上述製造真正簡單的項目只是爲了看看,如果我做這一切是錯誤的。這工作得很好,所以別的東西一定會導致它失敗。

*編輯#3 *問題修正

看在上帝的份上,我想通了。我一直在這個小時,它只是愚蠢的是什麼導致它失敗。

解決方案是這樣的:當我聲明它時,我沒有實例化_propertynames。我正在用Linq查詢類屬性以獲取屬性列表,然後通過將......ProProperties.ToList < ...>()傳遞給構造函數來創建_propertynames。顯然,你必須實例化這個變量,使它在InitializeComponent期間命中。虛幻。 一旦我這樣做,然後在事後添加項目,它工作正常。

我希望WPF有一張臉,所以我可以打它。我知道這是我對它如何工作的無知,但我真的可以使用某種信息。

謝謝你們的幫助。一旦我處理了根本問題,這兩個建議都很有用。

private ObservableCollection<string> _propertynames 

必須

private ObservableCollection<string> _propertynames = new ObservableCollection<string>() 

回答

4

有這樣做的無數的方法。一旦你創建的集合在代碼隱藏,你可以:

  1. 呼叫Resources.Add將它添加到窗口的資源字典,然後綁定到資源,例如ItemsSource="{Binding {DynamicResource MyList}}"

  2. 給所述ComboBox一個名稱(使用x:Name屬性),並設定其ItemsSource明確地在代碼,例如MyComboBox.ItemsSource = myCollection;

  3. 創建一個類,使該集合成爲該類的一個屬性,並將該窗口的DataContext設置爲該類的一個實例並直接綁定到該實例。 ItemsSource = "{Binding MyCollectionProperty}"

  4. 將窗口的屬性設置爲窗口的屬性,將窗口的DataContext設置爲this,並綁定到該屬性(與#3基本上是相同的技術,只是不創建新類)。

  5. 沒有設置窗口的DataContext,你仍然可以參考它使用綁定,只要你給它一個名稱,如屬性{Binding ElementName=MyWindow, Path=MyCollection}。 (這與Ross的建議相同。)

  6. 或者,如果沒有給出窗口名稱,您可以使用RelativeSource綁定來查找祖先Window並綁定到它的屬性。我對自己編寫一個使用RelativeSource的工作綁定表達式的能力沒有任何信心,因此我將其作爲讀者的練習。

  7. 您可以設置ComboBox到您的收藏的實例的DataContext,然後將其ItemsSource{Binding}。你在實踐中可能不會這樣做;我提到它只是因爲它似乎是人們設置控件的DataContext而不設置綁定的常見錯誤,然後想知道爲什麼沒有顯示綁定對象的內容。

(雖然我已經說過的「窗口」在上面,一切我說的也確實爲用戶控件。)

我敢肯定還有其他的至少五個方法可以做到這是我沒有想到的。綁定確實非常靈活。

+0

我已經這樣做了,它沒有工作。 – Yatrix

+0

它應該工作,如果窗口的datacontext設置爲它自己(把「this.Datacontext = this;」在窗口的構造函數內)。 – Adrian

+0

就是我所擁有的。那不是完成同樣的事情? – Yatrix

2

你嘗試過這麼遠嗎?

我會如下,假設組合框接近它是用含公共財產MyObservableCollection代碼隱藏類用戶控件中:

<UserControl x:Name="MyCollectionOwnerControl"> 

    <ComboBox ItemsSource="{Binding ElementName=MyCollectionOwnerControl, Path=MyObservableCollection, Mode=OneWay}" /> 

</UserControl> 
+0

編輯我的原始條目與更多的信息。再次感謝,羅斯。 – Yatrix

相關問題