【问题标题】:Binding properties not working绑定属性不起作用
【发布时间】:2013-03-07 23:19:33
【问题描述】:

好吧,标题可能没有多大帮助,但这是我的问题。我在 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 还很陌生,所以我可能不会考虑一些简单的事情。

谢谢!

【问题讨论】:

    标签: c# .net silverlight xaml


    【解决方案1】:

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

    【讨论】:

    • 这不是错误,您只需要绑定到更改,并执行您的逻辑,您可以通过元数据使用强制值拦截点或属性更改处理程序
    【解决方案2】:

    你需要指定一个回调来监控属性变化:

    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 的回答以了解原因。

    【讨论】:

      【解决方案3】:

      为此,可以使用Raise Property Change事件,即与propertychanged事件处理程序一起使用,代码sn-p如下:

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-01
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多