1

タイトルはあまり役に立たないかもしれませんが、ここに私の問題があります。SILVERLIGHTのコントロール間でプロパティをバインドする際に問題が発生します。構造は次のとおりです。

  1. 「ProjectItemList」と呼ばれるコントロールがあります。このコントロールは文字列を受け取り、非常に簡単な方法で表示します。
  2. 「ProjectList」と呼ばれるコントロールがあります。このコントロールは文字列の配列を受け取り、「ProjectItemList」コントロールを使用して配列内の各文字列を表します。
  3. 「ProjectWindow」と呼ばれるウィンドウがあり、このウィンドウには「ProjectList」コントロールと「Nombres」と呼ばれる依存関係プロパティが含まれています。

コンテキスト:「ProjectWindow」ウィンドウには「ProjectList」コントロールが含まれ、ProjectWindowの依存関係プロパティ「Nombres」と依存関係プロパティ「ListOfNames」の間にバインディングがあります。「ListOfNames」依存関係プロパティのコードは次のとおりです。

public static DependencyProperty ListOfNamesProperty =
        DependencyProperty.Register("ListOfNames", typeof(string[]), typeof(ProjectList), new PropertyMetadata(null));
public string[] ListOfNames
{
   get
   {
      return (string[])GetValue(ListOfNamesProperty);
   }

   set
   {
      SetValue(ListOfNamesProperty, value);
      List<ProjectItemList> auxList = new List<ProjectItemList>();
      foreach (string s in value)
      {
         ProjectItemList il = new ProjectItemList();
         il.Nombre = s;
         this.lb_projects.Items.Add(il);
      }
    }
 }

問題は、「ProjectList」のリストコントロールは「Nombres」プロパティを表しますが、「ListOfNames」の「Set」は呼び出されないため、各「ProjectItemList」オブジェクトを作成してデータを表すことができないことです。

私はXAMLとSilverlightにかなり慣れていないので、単純なことを考えていないかもしれません。

ありがとう!

4

3 に答える 3

1

依存関係プロパティを使用する場合、set と get は UI バインディングを介して呼び出されません。これが問題です。WPF UI コントロールは、getter と setter を介さずに依存プロパティと直接やり取りします。

于 2013-03-07T23:25:58.907 に答える
0

これを実現するには、Raise Property Change イベントを使用できます。つまり、propertychanged イベント ハンドラーを使用できます。コード スニペットは次のようになります。

            public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

OnPropertyChanged を使用してプロパティをバインドし、そのプロパティに変更があった場合は通知し、バインディング プロパティが自動的に変更され、これらのプロパティにバインドされている UI が更新されます。

于 2013-11-26T08:32:43.983 に答える
0

プロパティの変更を監視するには、コールバックを指定する必要があります。

public static DependencyProperty ListOfNamesProperty =
    DependencyProperty.Register("ListOfNames", typeof(string[]), typeof(ProjectList),
    new PropertyMetadata(ListOfNamesChaned));

private static void ListOfNamesChaned(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    List<ProjectItemList> auxList = new List<ProjectItemList>();
    foreach (string s in value)
    {
        ProjectItemList il = new ProjectItemList();
        il.Nombre = s;
        this.lb_projects.Items.Add(il);
    }
}

public string[] ListOfNames
{
    get
    {
        return (string[])GetValue(ListOfNamesProperty);
    }

    set
    {
        SetValue(ListOfNamesProperty, value);
    }
}

その理由を知るには、Chen Kinnrotの回答を参照してください。

于 2013-03-07T23:39:47.670 に答える