2014-08-27 85 views
1

我有一个弹出的ListView,以这种方式声明:WPF C#获取选中行项目列表视图

<ListView x:Name="ShowFileLV" 
      ItemsSource="{Binding EmployeeCollection}" 
      DataContext="{Binding}" 
      SelectedItem="{Binding Path=SelectedEmployee}" 
      SelectionMode="Single"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Width="140" 
          DisplayMemberBinding="{Binding Name}"> 
       <GridViewColumnHeader Click="SortClick" 
             Tag="Name" 
             Content="Name" /> 
      </GridViewColumn> 
      <GridViewColumn Width="140" 
          DisplayMemberBinding="{Binding ID}"> 
       <GridViewColumnHeader Click="SortClick" 
             Tag="ID" 
             Content="ID" /> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

名单和排序做工精细。我的问题是,我想获得直接更新SelectedEmployee时,我选择了某行(不知道ListViewItem的选择是正确的),或者甚至更好,只得到ID或名称:

public ListViewItem SelectedEmployee 
{ 
    get 
    { 
     return _selectedEmployee; 
    } 
    set 
    { 
     _selectedEmployee= value;   
    } 
} 

这是工作,直到我用装载有字符串,同时含有名称和ID的每个字符串的列表的列表框(而不是ListView中),像这样的

<ListBox Name="ShowFileLV" 
     SelectionMode="Single" 
     SelectedValue="{Binding Path=Employee}" 
     Style="{StaticResource ListBoxStyle}" ItemsSource="{Binding Path=ListPopupItems}" > 
</ListBox> 

使用公共字符串等:

public String Employee 
{ 
    get 
    { 
     return _employee; 
    } 
    set 
    { 
     _employee= value; 
     OnPropertyChanged("Employee"); 
    } 
} 

当我选择一行时,它会自动设置公共字符串Employee,而不需要代码。 我怎样才能使用ListView和Collections?

回答

0

SelectedItem绑定会将值设置为您的集合EmployeeCollection中的类型。因此,假设EmployeeCollection是ObservableCollection<Employee>,您需要将SelectedEmployee从ListViewItem更改为Employee。另外,请确保您使用的是INotifyPropertyChanged界面。

public Employee SelectedEmployee 
{ 
    get 
    { 
     return _selectedEmployee; 
    } 
    set 
    { 
     _selectedEmployee= value; 
     RaisePropertyChanged("SelectedEmployee"); 
    } 
} 

如果您只想要名称或ID,则使用SelectedValue和SelectedValuePath而不是SelectedItem。

<ListView x:Name="ShowFileLV" 
      ItemsSource="{Binding EmployeeCollection}" 
      DataContext="{Binding}" 
      SelectedValue="{Binding Path=SelectedEmployee}" 
      SelectedValuePath="Name" 
      SelectionMode="Single"> 

public string SelectedEmployee 
{ 
    get { return _selectedEmployee; } 
    set 
    { 
     _selectedEmployee = value; 
     RaisePropertyChanged("SelectedEmployee"); 
    } 
} 
+0

谢谢你的回复李。我没有使用INotifyPropertyChanged,实际上我不知道如何使用它。但是我可以补充一点,当我运行代码时,我在SelectedEmployee的set属性中将{MySolutionName.ViewModel.MainWindowViewModel.Employee}作为“值”。为什么我会得到一个地址而不是行内容? – Parni 2014-08-27 15:36:31

+1

您一定错过了SelectedValuePath。这应该是您想要的属性,例如Name或ID(如果ID是int,则将SelectedEmployee更改为int)。它的工作方式没有SelectedValuePath,当你收集的是一串字符串,但是当它是一个类时,你需要告诉它使用哪个属性。 – 2014-08-27 15:56:40

+0

非常感谢李。它解决了 – Parni 2014-08-28 06:39:27

相关问题