Как переопределить ViewModel DataContext, чтобы я мог связываться с объектами в представлении (Mvvm-Light)? - PullRequest
3 голосов
/ 18 января 2011

Я использую Mvvm-Light и до сих пор игнорировал, как на самом деле работает связывание в XAML.

Вот мой XAML

<phone:PhoneApplicationPage.Resources>
</phone:PhoneApplicationPage.Resources>

<Grid x:Name="LayoutRoot" Background="Transparent">

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,14">
        <TextBlock x:Name="ApplicationTitle" Text="{Binding SecuritySystemName}" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="{Binding PageName}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <TextBlock Name="textCode" 
        DataContext="{WHAT GOES HERE to bind to properties on my View (SecurityPanelPage class)}"    
        Text="{Binding Path=Code}" />

</Grid>

{Binding SecuritySystemName} и {Binding PageName} правильно связываются с моей ViewModel (SecuirtyPanelViewModel). Но я хочу, чтобы {Binding Code} в элементе TextBlock связывался с моим VIEW (а не с ViewModel).

Я искал и искал документацию и примеры, объясняющие синтаксис и значения, поддерживаемые DataContext и Binding. Ничего не помогло.

Все, что я хочу знать, - это как установить DataContext (или указать что-то в {Binding ...}, который будет указывать на мой объект View. Я пробовал "Self" и все виды вещей "RelativeSource") , но ничего не работает. Гадание не продуктивно, потому что обход в отладчике до разбора XAML слишком длинный.

Спасибо.

ОБНОВЛЕНИЕ - Я нашел ответ, который заставляет меня двигаться, но я все еще не лажу, поэтому у меня есть дополнительные вопросы для прекрасных плакатов ниже.

Вот что работает:

<phone:PhoneApplicationPage x:Name="ThisPage">
   <TextBlock Name="textCode" Text="{Binding Code, ElementName=ThisPage"/>
</phone:PhoneApplicationPage>

Я нашел этот намек здесь: http://bursjootech.blogspot.com/2007/12/bind-from-xaml-to-local-property-in.html

Он задал вопрос по-другому: как "Привязать из XAML к локальному свойству в code-behind".

Я все еще не понимаю два решения, представленные ниже. Так что больше вопросов ниже ...

Ответы [ 2 ]

5 голосов
/ 18 января 2011

Как правило, когда вы используете MVVM, почти все ваши привязываемые свойства находятся в вашей ViewModel, а не в ваших представлениях.Однако, очевидно, иногда вы хотите создать компоненты управления, которые имеют свойства.Можете ли вы объяснить, что это за свойство и почему оно должно быть только свойством в представлении?

При этом ... Я предполагаю, что ваш SecurityPanelPage является представлением для отображаемого XAML?

Вы можете дать своему элементу управления имя и затем использовать привязку ElementName.Таким образом, вам не нужно устанавливать DataContext.

<phone:PhoneApplicationPage
  x:Name="controlName"
  x:Class="SomeNamespace.SecurityPanelPage">
</phone:PhoneApplicationPage>

И тогда ваша привязка изменится на:

<TextBlock
  Name="textCode" 
  Text="{Binding Path=Code, ElementName=controlName}" />

Чтобы явно установить DataContext, вы можете сделать следующее:

<TextBlock
  Name="textCode" 
  DataContext="{Binding ElementName=controlName}"
  Text="{Binding Path=Code}" />
1 голос
/ 18 января 2011

Если я прав, вы можете добавить ресурсы в вашем app.xaml к желаемому представлению.

AE:

xmlns:crap="clr-namespace:Application.Views"
<Application.Resources>
    <ResourceDictionary>
        <crap:MyViewPage x:Key="MyViewPage" />
    </ResourceDictionary>  
</Application.Resources>

, а затем использовать его как "{Binding MyProperty, source={StaticResource MyViewPage}".

Надеюсь, что это работает / помогает

...