0

Windows 8 ストア アプリ (Metro / Modern?) を作成しており、複数のフォームで書式設定を再利用するためのコントロールを作成しています。過去にいくつかの WPF アプリを作成しましたが、WPF で行ったのと同じ方法で依存関係プロパティを作成しようとしました。コントロールをフォームに配置して使用すると、値が返されません。

私の personControl.cs WPF クラス:
public partial class PersonControl : UserControl {

    public PersonControl()
    {
        InitializeComponent();

    }

    public static readonly DependencyProperty PersonProperty = 
        DependencyProperty.Register("thisPerson", typeof(Person), typeof(PersonControl));

    public Person thisPerson
    {
        get
        {
            return (Person)GetValue(PersonProperty);
        }
        set
        {
            SetValue(PersonProperty, value);
        }
    }

}

Windows 8アプリの場合、PropertyMetadataを追加する必要があります-これが私が間違っているところだと思いますが、代わりに何をすべきかを追跡できませんでした:

パブリック部分クラス PersonControl : UserControl {

    public PersonControl()
    {
        InitializeComponent();

    }

    public static readonly DependencyProperty PersonProperty = 
        DependencyProperty.Register("thisPerson", typeof(Person), typeof(PersonControl), new PropertyMetadata(new Person()));

    public Person thisPerson
    {
        get
        {
            return (Person)GetValue(PersonProperty);
        }
        set
        {
            SetValue(PersonProperty, value);
        }
    }

}

私が知っている XAML でのコントロールの使用法またはバインディングに変更はありません。私はまだサンプルデータを使用しているので、List(Person) を作成してからリストボックスを作成し、リストボックスを List(Person) にバインドします。


バインディングコードは次のとおりです。

ユーザーコントロールの xaml で:

<Grid x:Name=”PersonGrid”&gt;
…….
<TextBox x:Name="txtFirstName" Text="{Binding Path=thisPerson.FirstName, ElementName=This}"></TextBox>

メインページ Xaml:

<StackPanel x:Name="layoutRoot">        
   <ListBox x:Name="myListbox">
       <ListBox.ItemTemplate>
           <DataTemplate>
                <local:PersonControl x:Name="myControl" thisPerson="{Binding Path=.}" Margin="5"></local:PersonControl>               
           </DataTemplate>
       </ListBox.ItemTemplate>
   </ListBox>

メインページのコードビハインド:

List<Person> People = new List<Person>();
… populate data … 
myListbox.ItemsSource = People;

追加のメモとして、UserControlXaml のコンテンツを取得し、UI 要素をメイン ページの XAML に直接配置すると、正常に動作します。失敗するのは、UserControl を使用するときです。

4

2 に答える 2

1

IIRC、SetProperty 呼び出しは、値がデフォルト値と異なる場合にのみ変更を登録します。繰り返しになりますが、IIRC の SetProperty は、オブジェクトへの参照が設定されているかどうかにかかわらず (object.Equals と object != null)、実際のオブジェクトを比較しません。このコードを使用すると...

new PropertyMetadata(new Person()));

オブジェクトがあり、新しいオブジェクトを割り当ててもプロパティが更新されないため、SetValue は期待どおりに機能しません。への変更

new PropertyMetadata(null)

物事は正しく機能すると思います。

急いでいたので、見落としがあるかもしれませんが…

于 2013-01-23T03:27:39.083 に答える
0

ユーザーコントロールの XAML の行のようです:

<TextBox x:Name="txtFirstName" Text="{Binding Path=thisPerson.FirstName, ElementName=This}">

Windows 8では同じようには機能しません-ElementNameとDependencyPropertyへの参照を取り出したとき(そして.Netにそれを自分で理解させてください)、うまくいきました。

それで:

 <TextBox x:Name="txtFirstName" Text="{Binding Path=FirstName}"></TextBox>

正常に動作し、バインディングが機能するようになりました。

于 2013-01-24T03:32:11.303 に答える