Простой DataBinding вопрос - PullRequest
1 голос
/ 07 марта 2009

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

1) Xaml

<Window x:Class="WpfApplication2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication2"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <local:Person x:Key="personInfo"/>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal">
        <RadioButton Name="r1" Click="onClick1">1st person</RadioButton>
        <RadioButton Name="r2" Click="onClick2">2nd person</RadioButton>   
        </StackPanel>
        <StackPanel Grid.Row="1" Orientation="Horizontal">
            <TextBlock Name="t1">First Name</TextBlock>                
            <TextBox Name="fn" Text="{Binding Path=FirstName}"/>

            <TextBlock Name="t2">Last Name</TextBlock>
            <TextBox Name="ln" Text="{Binding Path=LastName}"/>
        </StackPanel>
    </Grid>
</Window>

2) Кодовый код

public partial class Window1 : Window
    {
        Person p = new Person();
        Person[] list ;
        public Window1()
        {
            InitializeComponent();

            list = new Person[2] { new Person { FirstName = "John", LastName = "Smith"},
                                   new Person { FirstName = "Steve", LastName = "King"} };
        }

        public void onClick1(Object h , RoutedEventArgs arg)
        {
            p.FirstName = list[0].FirstName;
            p.LastName = list[0].LastName;
        }

        public void onClick2(Object h, RoutedEventArgs arg)
        {
            p = list[1];

        }
    }

3) Person.cs

class Person : INotifyPropertyChanged
    {
        string firstName;
        string lastName;

        public string FirstName
        {
            get { return firstName; }
            set { firstName = value;
                  OnPropertyChanged("FirstName");
                } 
        }

        public string LastName
        {
            get { return lastName; }
            set { lastName = value;
                   OnPropertyChanged("LastName");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Большое спасибо!

1 Ответ

2 голосов
/ 07 марта 2009

Вы должны фактически установить источник привязки в коде, для этого вам нужно имя для StackPanel. Вы должны добавить имя к последней панели стека. Один в строке 1

<StackPanel 
  ...
  Name="m_panel" />

В коде события обновить DataContext

public void onClick1(Object h , RoutedEventArgs arg)
{
    p.FirstName = list[0].FirstName;
    p.LastName = list[0].LastName;
    m_panel.DataContext = p;
}

РЕДАКТИРОВАТЬ Уточнил, какую StackPanel назвать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...