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

时间:2017-02-09 12:22:08

标签: c# wpf data-binding custom-controls dependency-properties

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

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

Items属性是我在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 =&#34; {Binding Uri}&#34; .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();

它不再起作用了。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您永远不应该显式设置UserControl的DataContext。这样做可以有效地防止DataContext继承自控件的父级,因为绑定需要它,如

BaseUri="{Binding Uri}"

所以,删除行

DataContext = new CustomImageViewModel();

来自您控件的构造函数。

当您未明确设置“控件没有任何视图模型”时,这是不正确的。实际上,视图模型(或继承的DataContext)通过ItemsControl的项容器设置为ItemsSource集合中的相应项。因此,您的控件的DataContext会自动设置为您的班级A的实例。