我想編寫一個自定義異步圖像容器自定義控件。視圖模型初始化後,依賴項屬性不起作用
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<custom:CustomImage Width="64" Height="64" BaseUri="{Binding Uri}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Items屬性是對象的名單我在MainWindowViewModel初始化:
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 Property(你可以在上面看到: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 '而不是'List '作爲Items屬性的類型,以便在向集合中添加項目或從集合中刪除項目時啓用內置更改通知。 – Clemens
默認情況下(或根本),「BaseUri」屬性雙向綁定似乎並不合理。 – Clemens
最後,「異步圖像容器」看起來很奇怪,當你可以使用Image控件並將其Source屬性設置爲已經實現異步加載的BitmapImage時。 – Clemens