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

Dependency Property does not work after view model was initialized

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

<ItemsControl ItemsSource="{Binding Items}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <custom:CustomImage Width="64" Height="64" BaseUri="{Binding Uri}" />
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

项目 属性 是我在 MainWindowViewModel 中初始化的对象 A 的列表:

public List<A> Items { get; set; } = new List<A>();

foreach (XmlNode item in doc.LastChild.FirstChild.SelectNodes(".//item"))
{
    Items.Add(
        new A
        {
            Title = item.FirstChild.InnerText,
            Uri = new Uri(item.SelectNodes(".//enclosure")[0].Attributes["url"].Value)
        }
    );
}

我想在自定义控件上设置一个Dependency 属性(你可以在上面看到:BaseUri="{Binding Uri}"。Uri是属性的class 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();

来自控件的构造函数。


当您没有明确设置时,"control doesn't have any view model" 是不正确的。事实上,视图模型(或继承的 DataContext)通过 ItemsControl 的项目容器设置为 ItemsSource 集合中的适当项目。因此,您的控件的 DataContext 会自动设置为您的 class A.

的实例