2012-12-07 3 views
4

그래서 TabControl을 프로젝트 목록에 바인드했습니다 (각 탭은 하나의 프로젝트 임). 각 탭의 내용은 프로젝트 직원의 목록이있는 DataGrid이며 잘 작동합니다. 이제 DataGrid에서 현재 선택된 직원에 대한 정보를 보여 드리고자합니다. MainWindow.xaml 파일 : 여기에 몇 가지 코드는WPF DataGrid에서 SelectedItem 바인딩하기

<Window.Resources> 
    <DataTemplate x:Key="ItemTemplate"> 
     <TextBlock Text="{Binding Name}" /> 
    </DataTemplate> 

    <DataTemplate x:Key="ContentTemplate"> 
     <DataGrid ItemsSource="{Binding Employees}" SelectedItem="{Binding SelectedEmployee, Mode=TwoWay}" SelectionMode="Extended" SelectionUnit="FullRow" Name="employeesList"> 

     </DataGrid> 

    </DataTemplate> 
</Window.Resources> 

이상 단순히 라벨을 작성하여이 바인딩을 테스트 할 :

<Label Name="emp" Content="{Binding SelectedEmployee}"></Label> 

및 MainWindowViewModel :

 public Employee SelectedEmployee { get { return selectedEmployee; } 
     set 
     { 
      if (selectedEmployee != value) 
      { 
       selectedEmployee = value; 
       NotifyPropertyChanged("SelectedEmployee"); 
      } 
     } 
    } 

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

WPF의 초보자입니다. 몇 가지 팁을 읽었지만 도움이되지 않습니다. 'emp'레이블에는 아무 것도 표시되지 않습니다. 내가 뭘 놓치고 있니?

당신은 당신의 속성이 변경되었음을 통지하지 않는

답변

7

public Employee SelectedEmployee 
{ 
    get { return selectedEmployee; } 
    set 
    { 
     if (selectedEmployee != value) 
     { 
      selectedEmployee = value; 
      LastName = value; 
      NotifyPropertyChanged("SelectedEmployee"); //NotifyPropertyChanged("SelectedItem"); 
     } 
     } 
} 

시험을 시도해보십시오

<Window x:Class="WpfApplication6.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication6" 
     Title="MainWindow" Height="350" Width="763" Name="UI" > 
    <Window.Resources> 
     <DataTemplate x:Key="ItemTemplate"> 
      <TextBlock Text="{Binding Name}" /> 
     </DataTemplate> 
    </Window.Resources> 

    <Grid> 
     <DataGrid ItemsSource="{Binding ElementName=UI,Path=Employees}" SelectedItem="{Binding ElementName=UI,Path=SelectedEmployee}" SelectionMode="Extended" SelectionUnit="FullRow" Name="employeesList" Margin="0,41,0,0" /> 
     <Label Content="{Binding ElementName=UI,Path=SelectedEmployee.Name}" Height="28" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" Width="288" /> 
     <Label Content="{Binding ElementName=employeesList,Path=SelectedItem.Name}" Height="28" HorizontalAlignment="Left" Name="label2" VerticalAlignment="Top" Width="288" Margin="294,0,0,0" /> 
    </Grid> 
</Window> 

코드 :이 보인다

public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     private ObservableCollection<Employee> _employees = new ObservableCollection<Employee>(); 
     private Employee _selectedEmployee; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      Employees.Add(new Employee { Name = "sa_ddam213" }); 
     } 

     public ObservableCollection<Employee> Employees 
     { 
      get { return _employees; } 
      set { _employees = value; } 
     } 

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


     /// <summary> 
     /// Notifies the property changed. 
     /// </summary> 
     /// <param name="info">The info.</param> 
     public void NotifyPropertyChanged(String info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
    } 

    public class Employee 
    { 
     public string Name { get; set; } 
    } 

가 예상대로 작동, 또는 오전 나는 무엇인가 놓친다?

+0

감사합니다. 저의 실수였습니다. "SelectedEmployee"라고 쓰고 싶었습니다. 나는 그것을 바꿨지 만 그것은 도움이되지 못했다. – kcz

+0

몇 가지 테스트를했지만 효과가있는 것처럼 보이지만 DataGrid 템플릿을 보유하고있는 xaml이 없습니다. –