我的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;中的断点。永远不会被召唤。我做错了什么?
答案 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}