C# 视图模型初始化后,依赖项属性不起作用

C# 视图模型初始化后,依赖项属性不起作用,c#,wpf,data-binding,custom-controls,dependency-properties,C#,Wpf,Data Binding,Custom Controls,Dependency Properties,我想编写一个自定义异步图像容器自定义控件。我已从此控件创建了一个列表: <ItemsControl ItemsSource="{Binding Items}"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid> <custom:CustomImage Width="64" Height="64" BaseUri="

我想编写一个自定义异步图像容器自定义控件。我已从此控件创建了一个列表:

<ItemsControl ItemsSource="{Binding Items}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <custom:CustomImage Width="64" Height="64" BaseUri="{Binding Uri}" />
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
我想在自定义控件上设置一个依赖属性(您可以在上面看到:BaseUri=“{Binding Uri}”)。Uri是类a的属性

这是DP实施:

public Uri BaseUri
{
    get { return (Uri)GetValue(BaseUriProperty); }
    set { SetValue(BaseUriProperty, value); }
}

public static readonly DependencyProperty BaseUriProperty =
 DependencyProperty.Register("BaseUri", typeof(Uri),
 typeof(CustomImage), new FrameworkPropertyMetadata(default(Uri), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
仅当CustomImage自定义控件没有任何视图模型时,它才起作用。如果我在CustomImage的构造函数中执行此操作:

DataContext = new CustomImageViewModel();
它不再工作了


有什么想法吗?

您不应该显式地设置UserControl的DataContext。这样做可以有效地防止DataContext从控件的父控件继承,因为这是绑定(如

BaseUri="{Binding Uri}"
因此,请删除该行

DataContext = new CustomImageViewModel();
来自控件的构造函数



如果不显式设置“控件没有任何视图模型”,则这不是真的。事实上,视图模型(或继承的DataContext)通过ItemsControl的item容器将设置为
ItemsSource
集合中的相应项。因此,控件的
DataContext
将自动设置为类的实例
A

除了答案中所述的内容外,还应使用
ObservableCollection
而不是
List
作为
Items
属性的类型,在将项添加到集合或从集合中移除时启用内置更改通知。默认情况下,
BaseUri
属性绑定双向(或完全绑定)似乎也没有意义。最后是“异步映像容器”看起来很奇怪,当您可以只使用图像控件并将其源属性设置为BitmapImage时,它已经实现了异步加载。但是我希望自定义控件有一个单独的视图模型,其中包含我需要的所有异步操作(和其他可绑定属性)。可能吗?“可能吗?”是的,但这没有意义。您想绑定控件的属性,如
BaseUri=“{Binding Uri}”
,因此必须继承DataContext。哦,我明白了。谢谢!
BaseUri="{Binding Uri}"
DataContext = new CustomImageViewModel();