绑定属性不起作用

时间:2013-03-07 23:19:34

标签: c# .net silverlight xaml

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

  1. 有一个名为“ProjectItemList”的控件,此控件将接收一个字符串并以非常简单的方式显示它。
  2. 有一个名为“ProjectList”的控件,该控件将返回一个字符串数组,并使用控件“ProjectItemList”来表示数组中的每个字符串。
  3. 有一个名为“ProjectWindow”的窗口,该窗口包含一个“ProjectList”控件和一个名为“Nombres”的依赖项属性。
  4. 上下文:“ProjectWindow”窗口包含一个“ProjectList”控件,ProjectWindow的依赖属性“Nombres”和依赖属性“ListOfNames”之间存在绑定,这里是“ListOfNames”依赖属性的代码:< / p>

    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的新手,所以我可能不会考虑简单的事情。

    谢谢!

3 个答案:

答案 0 :(得分:1)

当您使用依赖项属性时,不会通过ui绑定调用set和get,这是您的问题。 WPF ui使用dependeny属性直接控制tald,而不通过你的getter和setter。

答案 1 :(得分: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 的答案,知道原因。

答案 2 :(得分:0)

为此,可以使用Raise Property Change事件,即propertychanged事件处理程序,Code snippet就像:

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

使用OnPropertyChanged绑定属性,如果该属性中的任何更改将通知,您的绑定属性将自动更改,并且将更新绑定到这些属性的ui。