2010-02-17 12 views
8

Posiadam formant UserControl WPF zawierający niestandardową właściwość DependencyProperty o nazwie MyDP. Chcę powiązać to do właściwości na moim ViewModel (który jest wstrzykiwany jako DataContext UserControl). Znam jeden sposób, aby to zrobić poprzez ustawienie wiązania w deklaracji usercontrol w oknie macierzystej XAML jako takie:Konfigurowanie powiązania z niestandardową właściwością DependencyProperty wewnątrz formantu użytkownika WPF

<Window x:Class="MyNamespace.Views.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:views="clr-namespace:MyNamespace.Views"> 
    <StackPanel> 
     <views:MyControl MyDP="{Binding Path=MyVMProperty, Mode=OneWayToSource}"/> 
    </StackPanel> 
</Window> 

Działa to dobrze, ale jako zastępca mogę skonfigurować wiązanie wewnątrz usercontrol w XAML, podobnie w jaki sposób ustawić powiązania poszczególnych kontroli w UserControl z innymi właściwościami ViewModel?

Odpowiedz

15

Nie możesz zrobić tego, co pierwotnie myślałeś bezpośrednio. Prawdopodobnie próbowałeś i dostałeś kilka błędów kompilacji. Nie można ustawić własnej właściwości niestandardowej w głównym XAML UserControl, ponieważ typem elementu jest UserControl, więc kompilator wymusza nazwy właściwości na podstawie tego typu, a nie niestandardowego typu. Możesz obejść to, zmieniając się w Attached Property, ale to faktycznie zmienia znaczenie MyDP. Zamiast tego możesz ustawić domyślne ustawienie w stylu kontrolki UserControl i uzyskać dodatkową korzyść z możliwości zastąpienia go dowolnym zadeklarowanym wystąpieniem, wykonując tylko to, co jest w oryginalnym przykładzie. Ustaw pod elementu głównego Twojego UserControl za:

<UserControl.Style> 
    <Style> 
     <Setter Property="views:MyControl.MyDp" Value="{Binding Path=MyVMProperty, Mode=OneWayToSource}" /> 
    </Style> 
</UserControl.Style> 
+0

To działało idealnie, dzięki! Nie jest to najbardziej oczywiste podejście do tego noobu WPF, ale twoje wyjaśnienie z pewnością wyjaśnia sytuację. –

+0

Dziękuję. Dobrze mi też działało, choć zauważam, że chciałem powiązać UC z datacontextem, więc OneTime było dla mnie właściwym trybem. – GarethJ

+0

Bardzo pomocny. Dzięki. – tronious

1

Można również zdefiniować wiązanie w konstruktorze MainWindow, tak:

public MainWindow() 
{ 
    InitializeComponent(); 
    SetBinding(MyDPProperty, "MyVMProperty"); 
} 
Powiązane problemy