【发布时间】:2017-02-09 12:22:07
【问题描述】:
我想写一个自定义的异步图像容器自定义控件。我从这个控件创建了一个列表:
<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)
}
);
}
我想在自定义控件上设置一个依赖属性(你可以在上面看到: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();
它不再起作用了。
有什么想法吗?
【问题讨论】:
-
除了答案中所说的之外,您应该使用
ObservableCollection<A>而不是List<A>作为Items属性的类型,以便在添加或删除项目时启用内置更改通知集合。 -
BaseUri属性默认(或根本)绑定双向似乎也没有意义。 -
最后,“异步图像容器”看起来很奇怪,因为您可以使用 Image 控件并将其 Source 属性设置为已经实现异步加载的 BitmapImage。
标签: c# wpf data-binding custom-controls dependency-properties