UserControl中的依赖属性List <string> </string>

时间:2012-01-20 15:15:40

标签: c# wpf dependency-properties

我的dot net程序集中的用户控件中有一个依赖项属性(字符串列表),如下所示

public partial class ItemSelectionUserControl : UserControl
{
   public List<string> AvailableItems
    {
        get { return (List<string>)this.GetValue(AvailableItemsProperty); }
        set { this.SetValue(AvailableItemsProperty, value); }
    }
    public static readonly DependencyProperty AvailableItemsProperty = DependencyProperty.Register(
      "AvailableItems", typeof(List<string>), typeof(ItemSelectionUserControl), new FrameworkPropertyMetadata{BindsTwoWayByDefault =true});


    public ItemSelectionUserControl()
    {
        InitializeComponent();
    }


}

我正在尝试在另一个用户控件中使用此usercontrol,如下所示

    <UserControl 
     xmlns:ctrl="clr-namespace:HH.Windows.UserControls;assembly=HH.Windows.UserControls"
    />

   // .....
    <Grid>
     <ctrl:ItemSelectionUserControl Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="3" AvailableItems="{Binding Path=CheckList}"/>
    </Grid>

我可以看到CheckList的get访问器被调用,但它没有设置依赖属性&#34; AvailableItems&#34;。 &#34; AvailableItems&#34;中的断点。永远不会被召唤。我做错了什么?

2 个答案:

答案 0 :(得分:6)

据我所知,如果WPF公开DependencyProperty,它可能不会直接调用你的属性的setter。相反,它可以直接设置DependencyProperty。有关更多信息,请参阅Dependency Properties Overview on MSDN。特别是本节:

  

依赖属性可能会在多个位置“设置”
  以下是示例XAML,其中相同的属性(背景)具有三个可能影响该值的“set”操作...

要测试您的示例中是否发生这种情况(以及获取可以对设置值进行操作的通知),您可以尝试在FrameworkPropertyMetadata

中添加回调

e.g。

public partial class ItemSelectionUserControl : UserControl 
{    
    public List<string> AvailableItems     
    {         
        get { return (List<string>)this.GetValue(AvailableItemsProperty); }         
        set { this.SetValue(AvailableItemsProperty, value); }     
    }     

    public static readonly DependencyProperty AvailableItemsProperty = 
        DependencyProperty.Register("AvailableItems", 
        typeof(List<string>), typeof(ItemSelectionUserControl), 
        new FrameworkPropertyMetadata(OnAvailableItemsChanged) 
        {
            BindsTwoWayByDefault =true
        });       

    public ItemSelectionUserControl()     
    {         
        InitializeComponent();     
    }   

    public static void OnAvailableItemsChanged(
           DependencyObject sender, 
           DependencyPropertyChangedEventArgs e)
    {
        // Breakpoint here to see if the new value is being set
        var newValue = e.NewValue;
        Debugger.Break();
    }
} 

答案 1 :(得分:0)

您尚未指定绑定模式。也许它只是单向违约? 尝试:{Binding Path=CheckList, Mode=TwoWay}