2017-02-09 50 views
0

我想編寫一個自定義異步圖像容器自定義控件。視圖模型初始化後,依賴項屬性不起作用

<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(); 

它不起作用了。

任何想法?

+0

默認情況下(或根本),「BaseUri」屬性雙向綁定似乎並不合理。 – Clemens

+0

最後,「異步圖像容器」看起來很奇怪,當你可以使用Image控件並將其Source屬性設置爲已經實現異步加載的BitmapImage時。 – Clemens

回答

1

你不應該明確地設置UserControl的DataContext。這樣做有效地防止在DataContext從控制的父繼承,因爲它是由一個結合樣

BaseUri="{Binding Uri}" 

所以需要,從控制的構造函數刪除行

DataContext = new CustomImageViewModel(); 


當您沒有明確設置時,「控件沒有任何視圖模型」是不正確的。實際上,視圖模型(或繼承的DataContext)通過ItemsControl的項目容器設置爲ItemsSource集合中的相應項目。因此,您控件的DataContext會自動設置爲您的類A的一個實例。

+0

但我想要一個包含我需要的所有異步操作(和其他可綁定屬性)的自定義控件的單獨視圖模型。可能嗎? – Panthesilea

+0

「有可能嗎?」是的,但它沒有意義。你想綁定你的控件的屬性,比如'BaseUri =「{Binding Uri}」',所以必須繼承DataContext。 – Clemens

+0

哦,我明白了。謝謝! – Panthesilea