绑定属性不起作用

本文关键字:不起作用 属性 绑定 | 更新日期: 2023-09-27 18:02:45

标题可能没有多大帮助,但这是我的问题。我在SILVERLIGHT控件之间绑定属性时有问题。结构如下:

  1. 有一个名为"ProjectItemList"的控件,该控件将接收一个字符串并以一种非常简单的方式显示它。
  2. 有一个名为"ProjectList"的控件,该控件将接收字符串数组,并使用控件"ProjectList"来表示数组中的每个字符串。
  3. 有一个名为"projectwwindow"的窗口,该窗口包含一个名为"ProjectList"的控件,以及一个名为"Nombres"的依赖属性。

上下文:"projectwwindow"窗口包含一个"ProjectList"控件,在projectwwindow的依赖属性"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"从未被调用,所以我不能创建每个"ProjectList"对象并表示数据。

我对XAML和Silverlight相当陌生,所以我可能不会考虑简单的东西。

谢谢!

绑定属性不起作用

当你使用依赖属性时,set和get不是通过ui绑定调用的,这是你的问题。WPF ui控件直接使用依赖属性,而不需要通过getter和setter。

您需要指定一个回调来监视属性更改:

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);
    }
}

请参考陈金诺的答案。

要实现这一点,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将更新绑定到这些属性。