我有一个自定义控制器可以正常工作:
<Controller:DLBox ID="{Binding SHVM.Selected.ID}" />
我的意思是将ID
绑定到ViewModel
中的属性。但是当我想像这样绑定它时:
<ScrollViewer DataContext="{Binding SHVM.Selected}">
<Controller:DLBox ID="{Binding ID}" />
</ScrollViewer>
绑定到父级的 DataContext ,它根本不起作用。我还有一些其他的自定义控制器,它们很好,但我不知道这个问题到底是什么!
这是控制器:
public partial class DLBox : UserControl
{
public static DependencyProperty IDProperty =
DependencyProperty.Register("ID", typeof(int), typeof(DLBox),
new FrameworkPropertyMetadata(0,FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
(o, e) => (o as DLBox).IDPropertyChanged((int)e.NewValue)));
public int ID { get; set; }
private void IDPropertyChanged(int e)
{
ID = e;
}
}
有人可以告诉我的错误吗?因为我正在调试6个小时并没有找到任何东西!非常感谢。
的更新:
这只是添加:
<... DataContext={Binding} .../>
我不知道为什么!
现在真正的问题是我想在2 ItemsControls 中使用它,甚至使用 DataContext 仍然无效。
(只是为了澄清,我在彼此里面有2个列表。想想第一个像10个学校第一个列表,在每个学校里面都有一些学生第二个列表)
<ItemsControl ItemsSource="{Binding Source={StaticResource Locator}, Path=SHVM.Extra.Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl DataContext="{Binding}" ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Controller:DLBox DataContext="{Binding}" ID="{Binding ID}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
<ItemsControl.ItemTemplate>
</ItemsControl>
更新2:
在TextBlock
中,ID只是UserControl
。我没有什么可以在这里展示的!
我所做的一切,只需在PropertyCallBack中设置TextBlock
的文本(我的控制器中没有使用MVVM):
<TextBlock x:Name="txtIDValue"/>
在CodeBehind中:
private void IDPropertyChanged(string e)
{
ID= e;
txtIDValue.Text = e;
}
这个问题没有任何关系,这就是我无法弄明白的原因! 感谢任何帮助。
解答:
经过12个小时的研究,我发现这是一个愚蠢的错误!我不知道为什么以及何时在控制器的 XAML 中设置DataContext
!
无论如何,谢谢。
答案 0 :(得分:2)
您的依赖项属性声明是错误的,因为CLR包装器的getter和setter必须分别调用GetValue
和SetValue
方法。除此之外,您的PropertyChangedCallback是多余的。在刚刚设置属性值时调用的回调中不需要再次设置属性。
声明应如下所示:
public static readonly DependencyProperty IDProperty = DependencyProperty.Register(
"ID", typeof(int), typeof(DLBox),
new FrameworkPropertyMetadata(
0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public int ID
{
get { return (int)GetValue(IDProperty); }
set { SetValue(IDProperty, value); }
}