2010-09-02 69 views
3

我想爲我的應用程序做一個快速的用戶控件,但保留在MVVM風格的東西我想我會設置將XAML的DataContext添加到我的UserControl後面的代碼中。WPF MVVM - 自定義控件不會綁定到可見性,如果我將DataContext設置爲後面的代碼

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

這讓我的XAML到屬性綁定在我後面的代碼。

一切都很順利,直到我將控件實例的可見性綁定到ViewModel上的Visibility屬性爲止。

<Controls:RoundProgress Visibility="{Binding ProgressVisibility}" Width="100" Height="100"></Controls:RoundProgress> 

知名度不再適用 - 如果我在DataContext從用戶控件刪除我的tinkerings - 知名度的作品!

有人可以請我嗎?謝謝

回答

10

不要從內部XAML設置UserControl本身的DataContext。通過這樣做,您可以重寫繼承的DataContext,並使您的Binding在UC中而不是ViewModel上查找ProgressVisibility屬性。取而代之的是在UC內部的元素上設置DataContext:

<UserControl x:Class...> 
    <Grid DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"> 
    ... 
    </Grid> 
</UserControl> 
+0

謝謝,這是完美的。 – 2010-09-03 09:16:48

+0

我試過了。它給了我一個錯誤。屬性'AncestorType'不存在於XML名稱空間'http://schemas.microsoft.com/winfx/2006/xaml/presentation'中的'RelativeSource'類型中。 – user20358 2010-11-30 09:58:36

+0

要明確,您在XAML中指定的DataContext將在'InitializeCompenent()'期間設置。 – 2014-10-29 18:47:03

1

DataContext被繼承。如果您已更改控件的DataContext,以便它不再引用視圖模型並指向自身,則子控件將不再能夠訪問視圖模型上的屬性。

如果你在你的代碼隱藏屬性,它指向視圖模型,你可以這樣做:

<Controls:RoundProgress Visibility="{Binding ViewModel.ProgressVisibility}" ... 

或者你可以離開的datacontext爲是(指向視圖模型),並添加相關源到任何你希望數據來自代碼隱藏的綁定 - 例如:

<Button Text="{Binding ButtonText, Source={RelativeSource Mode=FindAncestor, AncestorType={x:Type MyUserControl}}}"/> 
相關問題