我想编写一个自定义异步图像容器自定义控件。我已从此控件创建了一个列表:
<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();
它不再起作用了。
有什么想法吗?
答案 0 :(得分:1)
您永远不应该显式设置UserControl的DataContext。这样做可以有效地防止DataContext继承自控件的父级,因为绑定需要它,如
BaseUri="{Binding Uri}"
所以,删除行
DataContext = new CustomImageViewModel();
来自您控件的构造函数。
当您未明确设置“控件没有任何视图模型”时,这是不正确的。实际上,视图模型(或继承的DataContext)通过ItemsControl的项容器设置为ItemsSource
集合中的相应项。因此,您的控件的DataContext
会自动设置为您的班级A
的实例。