自定义控件DataContext不起作用

时间:2016-12-13 21:32:48

标签: c# wpf

我有一个自定义控制器可以正常工作:

<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! 无论如何,谢谢。

1 个答案:

答案 0 :(得分:2)

您的依赖项属性声明是错误的,因为CLR包装器的getter和setter必须分别调用GetValueSetValue方法。除此之外,您的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); }
}