2011-07-02 141 views
0

我正在一個項目上工作,我想用一個自定義數據模板填充用戶數據的列表框。我的問題是,當我點擊列表框中的某個項目時,如何知道我選擇了哪個項目?基本上,如果我選擇「凱文」,我想顯示他的數據。如果我選擇戴夫,我想顯示他的數據。我不知道如何在綁定數據後獲取數據...WPF數據綁定和模板

編輯:我發現了一個非常棒的教程,涵蓋了這一點。一個非常隱藏的寶石。

http://msdn.microsoft.com/en-us/library/aa480224.aspx

回答

1

將ComboBox的SelectedItem綁定到任何屬性。

<Window x:Class="ComboBoxSelectedItemBinding.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="500"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition></ColumnDefinition> 
     <ColumnDefinition></ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <ListBox x:Name="st" 
       ItemsSource="{Binding Path=Customers,Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" 
       SelectedItem="{Binding Path=SelectedCustomer,Mode=TwoWay}" 
       Margin="0,38,0,80"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=Name}"></TextBlock> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

    <TextBlock Text="{Binding Path=SelectedCustomer.Name}" Grid.Column="1" VerticalAlignment="Center" Margin="5"></TextBlock> 
</Grid> 

public partial class Window1 : Window, INotifyPropertyChanged 
{ 
    private ObservableCollection<Customer> customers; 
    public ObservableCollection<Customer> Customers 
    { 
     get 
     { 
      return customers; 
     } 
     set 
     { 
      customers = value; 
      NotifyPropertyChanged("Customers"); 
     } 
    } 

    private Customer selectedCustomer; 
    public Customer SelectedCustomer 
    { 
     get 
     { 
      return selectedCustomer; 
     } 
     set 
     { 
      selectedCustomer = value; 
      NotifyPropertyChanged("SelectedCustomer"); 
     } 
    } 


    public Window1() 
    { 
     Customers = new ObservableCollection<Customer>(); 
     Customers.Add(new Customer() { ID = 1, Name = "Ravi", Salary = 1000 }); 
     Customers.Add(new Customer() { ID = 99, Name = "Alex", Salary = 3000 }); 
     Customers.Add(new Customer() { ID = 123, Name = "Steve", Salary = 100 }); 
     Customers.Add(new Customer() { ID = 31, Name = "Alice", Salary = null }); 
     InitializeComponent(); 

     DataContext = this; 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    #endregion 
} 

public class Customer:INotifyPropertyChanged 
{ 
    private int id; 
    public int ID 
    { 
     get 
     { 
      return id; 
     } 
     set 
     { 
      id = value; 
      NotifyPropertyChanged("ID"); 
     } 
    } 

    private string name; 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
      NotifyPropertyChanged("Name"); 
     } 
    } 

    private decimal? salary; 
    public decimal? Salary 
    { 
     get 
     { 
      return salary; 
     } 
     set 
     { 
      salary = value; 
      NotifyPropertyChanged("Salary"); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    #endregion 
} 
+0

我實際上可以發現一個非常簡單的方法。由於數據綁定到列表框,因此我可以設置列表框的屬性: IsSynchronizedWithCurrentItem =「True」 然後將此設置爲true,我可以將我的文本框綁定到與列表框相同的數據,並且它將填充選定的項目的數據/ – Kevin

+0

什麼:代表在C#中,將在VB中實現? – Kevin

1

ListBoxSelectedIndex屬性將對應於所選擇的項的數據源的索引。所以假設你已經綁定了IList,你應該可以使用myDataSource[myListBox.SelectedIndex]。我假設你並沒有試圖支持多選,在這種情況下,你可以使用相同的概念,但實現更復雜。

0

取決於如果您讓用戶選擇ListBox中的一個或多個項目,您可以循環所有項目並檢查它是否被選中。這裏是一個小例子C#示例(可以在VB.NET做):

for (int i = 0; i < MyListBox.Items.Count; i++) 
{ 
     if(MyListBox.Items[i].Selected) 
      //Do what you want with the item with : MyListBox.Items[i].Value 
} 
0

這聽起來像是你將只能有一次選擇一個項目。如果是這樣,那麼我寧願將ListBox.SelectedItem綁定到我的ViewModel上的一個屬性。如果我們假設您將列表框綁定到Person類的集合,那麼ViewModel上的屬性將是Person類型。列表框將把這個屬性設置爲Person的選定實例。

然後,只需將顯示Kevin數據的UI的另一部分綁定到ViewModel上的屬性即可。

只要您在屬性上實現了INotifyPropertyChanged,當您更改列表框中的選定項時,您的UI應該會自動更新。