2011-11-01 87 views
2

嘿,我需要訪問我在WPF中創建的列表框中的項目。我現在所擁有的是用戶可以添加一個新的類對象到ListBox.ItemsSource綁定到的ObservableCollection。這個類有數據在那裏的數據用於像組合框,文本框和其他簡單的東西。訪問列表框中的數據

我所做確實是基於關閉的嘖嘖影像的一個從windowsclient.net

//Here's What I have so far 
    <ListBox x:Name="MyList" Width = "300" Height = 300"> 
     <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Vertical"> 
         <TextBlock x:Name="ItemName" 
         Text={Binding Path=PersonName}/> 
         <ComboBox x:Name="NumberOfRes" 
         SelectedIndex="0" 
         SelectionChanged="NumberOfRes_SelectionChanged" 
         ItemsSource={Binding Path=ListOfNums}/> 
        </StackPanel> 
       </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

    //ListOfNums 
    private ObservableCollection<int> _listofNums = 
        new ObservableCollection<int>() 
    { 1,2,3,4,5,6,7,8 }; 
    public ObservableCollection<int> ListOfNums 
    { 
     get{return _listOfNums;} 
    } 

    //class Resident 
    public class Resident 
    { 
     public string personName {get;set;} 
    } 

所以我有工作。我有一個按鈕添加一個新的類對象,每個對象都通過數據綁定正確地設置了數據。所以我可以看到我的默認personName當一個新的對象被添加,並且我有一個組合框填充ListOfNums整數。

雖然我的知識是我不知道如何訪問這些'子對象'(原諒我,我是新來的WPF,不知道適當的術語)正在選擇。我想知道在發生selectionChange事件時我的comboBox的SelectedItem是什麼,或者當用戶在textBox中鍵入內容時我的新personName設置爲什麼。因此,用戶在列表框中選擇這些ItemTemplate對象中的一個,並且該項目具有用戶單擊的組合框和其他UI控件。當用戶點擊其中一個UI控件時,一些數據會發生變化。

我試過((Resident)MyList.SelectedItem).personName和其他幾個方法來查看我是否可以訪問數據並操作它。現在有趣的是,我的ItemTemplate中的組合框有一個選擇更改事件,當選擇被更改時調用,但我無法訪問數據!

在此先感謝!

回答

1

有多種方法可以滿足你的要求。最簡單的方法是在您的ViewModel上添加SelectedItem屬性。

那麼你的視圖模型是這樣的......

public class MyViewModel : INotifyPropertyChanged 
{ 
     ObservableCollection<Resident> Residents { get; } 

     private Resident _selectedItem; 
     public Resident SelectedItem 
     { 
      get { return _selectedItem; } 
      set 
      { 
       _selectedItem = value; 
       PropertyChangedEventHandler handler = PropertyChanged; 
       if(handler != null) 
        handler(this, new PropertyChangedEventArgs("SelectedItem"); 
      } 
     } 
} 

在視圖設置DataContext這個ViewModel,你的ListBox.ItemsSource勢必Residents和你ListBox.SelectedItem勢必SelectedItem的一個實例。

<ListBox ItemsSource="{Binding Path=Residents}" 
     SelectedItem="{Binding Path=Selectedtem, Mode=TwoWay}" /> 

如果要執行的操作選擇何時更改,請注意您的SelectedItem setter方法,其中將包含新選定的項目。

編輯

只注意到你的Resident模型不落實INotifyPropertyChanged,它將需要做傳播的改變下游。然後您可以獲得數據將在SelectedItem屬性中提及的給定屬性的setter中更改的點。

+0

沒有它。我有一個從它繼承的ViewModelBase類,並感謝您的快速回復。 – CSMHowitzer

0

下面的示例使用ViewModel(VM)。如果您將新居民添加到居民收藏中,他們將顯示在列表框中。只是一個提示,如果你最終命名你的控件很多,你沒有正確地進行數據綁定。

XAML:

<ListBox ItemsSource="{Binding Path=Residents}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding Path=PersonName}" /> 
       <ComboBox 
        ItemsSource="{Binding Path=DataContext.ListOfNums, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" 
        SelectionChanged="NumberOfRes_SelectionChanged" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

後面的代碼:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = new VM(); 
    } 

    private void NumberOfRes_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
    { 
     ComboBox comboBox = sender as ComboBox; 
     Resident resident = comboBox.DataContext as Resident; 
     int number = (int)comboBox.SelectedItem; 
    } 
} 

public class VM 
{ 
    public VM() 
    { 
     Residents = new ObservableCollection<Resident>() { new Resident() { PersonName = "AAA" }, new Resident() { PersonName = "BBB" } }; 
    } 

    public ObservableCollection<Resident> Residents { get; private set; } 

    public IEnumerable<int> ListOfNums 
    { 
     get { return new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 }; } 
    } 
} 

public class Resident 
{ 
    public string PersonName { get; set; } 
}