2

Microsoft の Web サイトでいくつかの例をたどりました。最初の例は ItemsSource に関するものです。

2 番目のItemsControl.ItemsSource プロパティ :

方法: プロパティ変更通知を実装する

私の例にたどり着いた2つの例を一緒にマージします。

XAML

<Window x:Class="WpfSchede.Test.ItemsSourceTest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:WpfSchede.Test"
    Title="ItemsSourceTest" Height="352" Width="467">
<Window.Resources>
    <c:NameList x:Key="NameListData"></c:NameList>
    <DataTemplate x:Key="NameItemTemplate">
        <TextBlock Width="200" Text="{Binding Path=FullName, Mode=TwoWay}" />
    </DataTemplate>
</Window.Resources>                   
<Grid>
    <ListBox ItemsSource="{Binding Source={StaticResource NameListData}}" ItemTemplate="{StaticResource NameItemTemplate}" Margin="12,12,120,65" Name="listBoxNames" IsSynchronizedWithCurrentItem="True"> 
    </ListBox>
    <Button Content="Change First Name" Height="23" HorizontalAlignment="Left" Margin="12,270,0,0" Name="buttonChangeName" VerticalAlignment="Top" Width="163" Click="buttonChangeName_Click" />
    <Button Content="Change Full Name" Height="23" HorizontalAlignment="Left" Margin="193,270,0,0" Name="buttonChangeFullName" VerticalAlignment="Top" Width="163" Click="buttonChangeFullName_Click" />
</Grid>

XAML.CS

using System.Windows;
namespace WpfSchede.Test
{
public partial class ItemsSourceTest : Window
{
    public ItemsSourceTest()
    {
        InitializeComponent();
    }

    private void buttonChangeName_Click(object sender, RoutedEventArgs e)
    {
        PersonName p = listBoxNames.SelectedItem as PersonName;
        p.FirstName = "Andrew";
    }

    private void buttonChangeFullName_Click(object sender, RoutedEventArgs e)
    {
        PersonName p = listBoxNames.SelectedItem as PersonName;
        p.FullName = "Andrea Rossi";
    }
  }
}

NameList クラス

using System.Collections.ObjectModel;
using System.ComponentModel;

namespace WpfSchede.Test
{
public class NameList : ObservableCollection<PersonName>
{
    public NameList()
        : base()
    {
        Add(new PersonName("Wil", "Cath"));
        Add(new PersonName("Isak", "Dinesen"));
        Add(new PersonName("Victor", "Hugo"));
        Add(new PersonName("Jules", "Verne"));
        Add(new PersonName("Leonardo", "Rossi"));
    }
}

public class PersonName : INotifyPropertyChanged 
{
    private string firstName;
    private string lastName;
    // Define the event
    public event PropertyChangedEventHandler PropertyChanged; 

    public PersonName(string first, string last)
    {
        this.firstName = first;
        this.lastName = last;
    }

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

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    public string FullName
    {
        set {
            string full = value as string;
            char[] sep = { ' ' };
            string[] n = full.Split(sep);
            this.FirstName = n[0];
            this.LastName = n[1];
            OnPropertyChanged(value);
        }
        get { return firstName + " " + lastName; }
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }

    }
 }
}

2 つの質問があります。

最初) ボタンの 1 つをクリックすると、ListBox が変更を反映することを期待していましたが、代わりに何も起こりません! 私は何が欠けていますか?

2 番目) DataTemplate では、FullName にバインドします (FirstName のみにバインドする方が例としては簡単ですが、簡略化しすぎているように思えます)。そのため、NameList クラスと DataTemplate コードでカスタム コードを記述したプロパティ FullName にバインドすることにしました。コードの何が問題になっていますか? DataTemplate で Mode=TwoWay を指定するのは正しいですか?

4

1 に答える 1

1

OnPropertyChanged(値); 間違っている

OnPropertyChanged("FirstName"); である必要があります。また、OnPropertyChanged("FullName"); が続く必要があります。その結果

OnPropertyChanged("FirstName");
OnPropertyChanged("FullName");

LastName セット関数は

OnPropertyChanged("LastName");
OnPropertyChanged("FullName");

そして最後に関数を設定する必要があります

OnPropertyChanged("FullName");
OnPropertyChanged("FirstName");
OnPropertyChanged("LastName");
于 2013-01-18T12:55:17.550 に答える