2011-04-26 139 views
1

我是WPF,C#和數據綁定的新手。我只是試圖將一個簡單的組合框綁定到ObservedCollection。下面是代碼:WPF數據綁定到組合框

public class Directory 
{ 
    private string _ikey; 
    public string IKey 
    { 
     get 
     { 
      return _ikey; 
     } 
     set 
     { 
      _ikey = value; 
     } 
    } 
    private string _ivalue; 
    public string IValue 
    { 
     get 
     { 
      return _ivalue; 
     } 
     set 
     { 
      _ivalue = value; 
     } 
    } 

} 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 

{ 
    public ObservableCollection<Directory> DirectoryList = new ObservableCollection<Directory>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     DirectoryList = new ObservableCollection<Directory>(); 
     Directory _dirtemp = new Directory(); 
     _dirtemp.IKey = "1"; 
     _dirtemp.IValue = "Steve"; 
     DirectoryList.Add(_dirtemp); 

     _dirtemp = new Directory(); 
     _dirtemp.IKey = "2"; 
     _dirtemp.IValue = "John"; 
     DirectoryList.Add(_dirtemp); 




    } 
} 

我的XAML看起來是這樣的:

<Window x:Class="DataBindCombo.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:DataBindCombo" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ComboBox Height="48" HorizontalAlignment="Left" Margin="70,104,0,0" Name="comboBox1" VerticalAlignment="Top" Width="310" 
       ItemsSource="{Binding Path=DirectoryList}" 
       DisplayMemberPath="IValue" 
       SelectedValuePath="IKey" 
       > 

現在看來似乎應該是簡單的。我能夠將綁定放在代碼後面,它工作正常,但我希望通過xaml綁定它。

任何想法? TIA

回答

3

有幾個方法,你可以去這個問題。基礎知識是你需要做的,所以XAML可以看到你的收藏。您可以通過將其設置爲DataContext以隱式方式執行此操作。如果這是你綁定的唯一的東西,那麼它是一種快速和骯髒的綁定方式。它看起來是這樣的:

public partial class MainWindow : Window 

{ 
    public ObservableCollection<Directory> DirectoryList; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     DirectoryList = new ObservableCollection<Directory>(); 
     Directory _dirtemp = new Directory(); 
     _dirtemp.IKey = "1"; 
     _dirtemp.IValue = "Steve"; 
     DirectoryList.Add(_dirtemp); 

     _dirtemp = new Directory(); 
     _dirtemp.IKey = "2"; 
     _dirtemp.IValue = "John"; 
     DirectoryList.Add(_dirtemp); 


     DataContext=DirectoryList; 

    } 
} 

Window x:Class="DataBindCombo.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:DataBindCombo" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ComboBox Height="48" HorizontalAlignment="Left" Margin="70,104,0,0" Name="comboBox1" VerticalAlignment="Top" Width="310" 
       ItemsSource="{Binding}" 
       DisplayMemberPath="IValue" 
       SelectedValuePath="IKey" 
       > 

另一種方式更復雜,但可能會更頻繁地使用。要做到這一點你需要將您的集合在MainWindow中作爲DependencyProperty公開,然後綁定到該值。它看起來像這樣:

public partial class MainWindow : Window 
    { 
     public static DependencyProperty DirectoryListProperty = 
      DependencyProperty.Register("DirectoryList", 
      typeof(ObservableCollection<Directory>), 
      typeof(MainWindow)); 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     public ObservableCollection<Directory> DirectoryList 
     { 
      get { return (ObservableCollection<Directory>)base.GetValue(DirectoryListProperty); } 
      set { base.SetValue(DirectoryListProperty, value); } 
     } 
    } 

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" x:Name="mainWindow"> 
    <Grid> 
     <ComboBox Height="48" HorizontalAlignment="Left" Margin="70,104,0,0" Name="comboBox1" VerticalAlignment="Top" Width="310" 
       ItemsSource=" {Binding ElementName=mainWindow, Path=DirectoryList}" 
       DisplayMemberPath="IValue" 
       SelectedValuePath="IKey" 
       /> 

這也不是以這種方式完成它的唯一方法。一般來說,不是直接在控件上創建列表,而是創建視圖模型。 MVVM pattern是創建演示文稿的推薦方式,但我的示例爲您提供了一種獲取功能的方法。您可以玩這個遊戲並嘗試不同的方式。我發現在WPF中總是有多種方式來處理事情,並且找到最適合情況的方法。

1

綁定中的路徑相對於本地DataContext而不是包含Window。您尚未爲您的Window設置DataContext,因此WPF沒有查找DirectoryList屬性的對象。

使用您當前的對象模型,您需要在MainWindow構造函數中設置this.DataContext = this;。現在,MainWindow對象將是DataContext,DirectoryList綁定將根據MainWindow對象進行解析。 (從更長期來看,更好的做法是將數據模型移出到單獨的類,並將DataContext設置爲該類的一個實例,但這是一個單獨的問題。)

此外,WPF只能綁定到屬性,不是領域。您的DirectoryList屬性當前是一個字段;您將需要將其更改爲屬性。

0

您需要設置窗口的DataContext。例如像這樣:

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = this; 
    .... 
} 
0

點的結合,背後的代碼:

ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DirectoryList}" 
1

您需要做的是將ComboBox的DataContext設置爲等於您的ObservableCollection。

代碼隱藏:

public partial class MainWindow : Window 
{ 
    private ObservableCollection<Directory> directoryList; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     directoryList = new ObservableCollection<Directory>(); 
     Directory _dirtemp = new Directory(); 
     _dirtemp.IKey = "1"; 
     _dirtemp.IValue = "Steve"; 
     directoryList.Add(_dirtemp); 

     _dirtemp = new Directory(); 
     _dirtemp.IKey = "2"; 
     _dirtemp.IValue = "John"; 
     directoryList.Add(_dirtemp); 

     this.comboBox1.DataContext = DirectoryList; 
     //OR for the entire window you can simply do this.DataContext = DirectoryList; 
    } 

    public ObservableCollection<Directory> DirectoryList 
    { 
     get { return directoryList; } 
    } 
} 

public class Directory 
{ 
    private string _ikey; 
    public string IKey 
    { 
     get 
     { 
      return _ikey; 
     } 
     set 
     { 
      _ikey = value; 
     } 
    } 
    private string _ivalue; 
    public string IValue 
    { 
     get 
     { 
      return _ivalue; 
     } 
     set 
     { 
      _ivalue = value; 
     } 
    } 

} 

的XAML:

<Window x:Class="WpfApplication3.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="84" Width="167"> 
<Grid> 
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding}"/> 
</Grid> 

雖然,正如其他人所指出的,一個更好的辦法是使用模型 - 視圖 - 視圖模型設計模式。這將使View(xaml部分)與「業務邏輯」分開。這裏是一個很好的例子,介紹如何使用MVVM綁定組合框。

http://mark-dot-net.blogspot.com/2009/03/binding-combo-boxes-in-wpf-with-mvvm.html