2012-06-02 7 views
4

Я новичок в WPF. В моем примере приложения я использую ListView для отображения содержимого свойства. Я не знаю, как связать SelectedItem в ListView с свойством и затем привязать к TextBlock.SelectedItem в привязке ListView

Window.xaml

<Window x:Class="Exec.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Main window" Height="446" Width="475" > 

    <Grid> 
     <ListView Name="ListViewPersonDetails" Margin="15,12,29,196" ItemsSource="{Binding Persons}" SelectedItem="{Binding CurrentSelectedPerson}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="First name" DisplayMemberBinding="{Binding FirstName}"/> 
        <GridViewColumn Header="Last name" DisplayMemberBinding="{Binding LastName}"/> 
        <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 

     <TextBlock Height="23" Name="textFirstNameBlock" FontSize="12" Margin="97,240,155,144"> 
       <Run Text="Name: " /> 
       <Run Text="{Binding CurrentSelectedPerson.FirstName}" FontWeight="Bold" /> 
     </TextBlock> 

     <TextBlock Height="23" Name="textLastNameBlock" FontSize="12" Margin="97,263,155,121"> 
       <Run Text="Branch: " /> 
       <Run Text="{Binding CurrentSelectedPerson.LastName}" FontWeight="Bold" /> 
     </TextBlock> 

     <TextBlock Height="23" Name="textAddressBlock" FontSize="12" Margin="0,281,155,103" HorizontalAlignment="Right" Width="138"> 
       <Run Text="City: " /> 
       <Run Text="{Binding CurrentSelectedPerson.Address}" FontWeight="Bold" /> 
     </TextBlock> 

    </Grid> 
</Window> 

MainWindow.xaml.cs

Tman manager = new Tman(); 

     private List<Person> persons; 
     public List<Person> Persons 
     { 
      get 
      { 
       return this.persons; 
      } 

      set 
      { 
       if (value != null) 
       { 
        this.persons = value; 
       } 

      } 
     } 

     private Person currentSelectedPerson; 
     public Person CurrentSelectedPerson 
     { 
      get 
      { 
       return currentSelectedPerson; 
      } 
      set 
      { 
       this.currentSelectedPerson = value; 
      } 
     } 


     private void Window_Loaded(object sender, RoutedEventArgs e){ 
      ListViewPersonDetails.ItemsSource= manager.GetPersons(); 

     } 

Person.cs

class Person 
    { 
     public string FirstName 
     { 
      get; 
      set; 
     } 

     public string LastName 
     { 
      get; 
      set; 
     } 

     public string Address 
     { 
      get; 
      set; 
     } 

    } 

Спасибо за любую помощь ,

+0

NotifyPropertyChanged необходимо отправить имя свойства, вы по какой-то причине пытаетесь отправить другую строку? Не уверен, что это единственная проблема, вообще ли этот список заполняется? –

+0

Какое поведение вы сейчас получаете? Вы устанавливаете DataContext своего окна? Для этих привязок необходимо настроить работу. Кроме того, вы дважды устанавливаете ItemSource, один раз в XAML и один раз в коде. Вам нужно только установить его один раз. –

+0

@KDiTraglia Извините, я забыл удалить NotifyPropertyChanged. Знать Это работает, но я не знаю, как связать объекты свойств CurrentSelectedPerson с TextBlocks. – Matt

ответ

8
private void Window_Loaded(object sender, RoutedEventArgs e){ 
    ListViewPersonDetails.ItemsSource= manager.GetPersons(); 
} 

Это, вероятно, ваша проблема, вам не нужно устанавливать источник товаров таким образом. Просто замените эту строку ...

this.DataContext = this; 

Это то, что будет связывать свои свойства пользовательского интерфейса, так что все эти обязательные заявления имеют какое-либо значение.

Также вам необходимо обновить привязку к вашим текстовым блокам, чтобы фактически соответствовать именам свойств в классе Person.

<TextBlock Height="23" Name="textFirstNameBlock" FontSize="12" Margin="97,240,155,144"> 
    <Run Text="Name: " /> 
    <Run Text="{Binding CurrentSelectedPerson.FirstName}" FontWeight="Bold" /> 
</TextBlock> 

<TextBlock Height="23" Name="textLastNameBlock" FontSize="12" Margin="97,263,155,121"> 
    <Run Text="Branch: " /> 
    <Run Text="{Binding CurrentSelectedPerson.LastName}" FontWeight="Bold" /> 
</TextBlock> 

<TextBlock Height="23" Name="textAddressBlock" FontSize="12" Margin="0,281,155,103" HorizontalAlignment="Right" Width="138"> 
    <Run Text="City: " /> 
    <Run Text="{Binding CurrentSelectedPerson.Address}" FontWeight="Bold" /> 
</TextBlock> 

EDIT:

Испытано в VS, вам нужно 1 более маленькую вещь, чтобы реализовать INotifyPropertyChanged на имущество CurrentSelectedPerson ...

private Person currentSelectedPerson; 
public Person CurrentSelectedPerson 
{ 
    get { return currentSelectedPerson; } 
    set 
    { 
     currentSelectedPerson = value; 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("CurrentSelectedPerson")); 
    } 
} 

В качестве альтернативы это тоже работает, немного проще ...

<TextBlock Height="23" Name="textFirstNameBlock" FontSize="12" Margin="97,240,155,144"> 
    <Run Text="Name: " /> 
    <Run Text="{Binding ElementName=ListViewPersonDetails, Path=SelectedItem.FirstName}" FontWeight="Bold" /> 
</TextBlock> 

(повторите аналогичную логику для других текстовых полей)

+0

Спасибо, это помогло. В свойстве CurrentSelectedPerson выбран SelectedItem. Вы знаете, как я могу привязать объекты CurrentSelectedPerson к TextBlocks? – Matt

+1

Он должен работать, как вы указали, просто исправьте имена, чтобы они действительно соответствовали свойствам (currentSelectedPerson.FirstName вместо FstNamePerson). Будет редактировать сообщение. –

+0

Я не знаю почему, но это не работает. Я редактировал свой первый пост. В любом случае, спасибо за помощь. – Matt

Смежные вопросы