2011-07-02 16 views
0

私はプロジェクトで作業しており、カスタムデータテンプレートを含むリストボックスにユーザーデータを設定したいと考えています。私の質問は、リストボックスの項目をクリックすると、どの項目を選択したのかをどのように伝えることができるのですか?基本的に、「kevin」を選択すると、彼のデータを表示したいのです。 Daveを選択すると、彼のデータを表示したいと思います。私はそれがバインドされた後にデータを取得する方法を知らない...WPFデータバインディングとテンプレート

編集:これをカバーする本当に素晴らしいチュートリアルを発見した。非常に隠された宝石。

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

ListBox

答えて

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

私はacutally本当に簡単な方法を発見しました。データはリストボックスにバインドされているので、リストボックスのプロパティを設定することができます。 IsSynchronizedWithCurrentItem = "True" これをtrueに設定すると、テキストボックスをリストボックスと同じデータにバインドできます。選択された項目のデータ/ – Kevin

+0

が入力されます。何が:C#で立つか、それはVBで実装されますか? – Kevin

1

SelectedIndexプロパティは、データソース内の選択された項目のインデックスに対応します。ですから、IListにバインドしていると仮定すると、myDataSource[myListBox.SelectedIndex]を使用できるだけです。私は、マルチセレクションをサポートしようとしていないと仮定しています。この場合、同じコンセプトを使用できますが、実装はより複雑です。

0

リストボックス内の1つまたは複数のアイテムをユーザーに選択させる場合は、すべてのアイテムをループして選択したかどうかを確認するだけで済みます。ここでは(VB.NETで行うことができる)少し例C#の例です:あなたが唯一の項目が一度に選択されますように

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はリストボックス内の選択した項目を変更すると自動的に更新されます。

関連する問題