Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何覆盖ViewModel DataContext,以便可以绑定到视图中的对象(Mvvm灯光)?_C#_Silverlight_Xaml_Windows Phone 7_Mvvm Light - Fatal编程技术网

C# 如何覆盖ViewModel DataContext,以便可以绑定到视图中的对象(Mvvm灯光)?

C# 如何覆盖ViewModel DataContext,以便可以绑定到视图中的对象(Mvvm灯光)?,c#,silverlight,xaml,windows-phone-7,mvvm-light,C#,Silverlight,Xaml,Windows Phone 7,Mvvm Light,到目前为止,我一直在使用Mvvm Light并忽略XAML中的绑定是如何工作的 这是我的XAML <phone:PhoneApplicationPage.Resources> </phone:PhoneApplicationPage.Resources> <Grid x:Name="LayoutRoot" Background="Transparent"> <StackPanel x:Name="TitlePanel" Grid.Row="0

到目前为止,我一直在使用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}正确绑定到我的视图模型(SecuirtyPanelViewModel)。但是我希望TextBlock元素中的{Binding Code}绑定到我的视图(而不是ViewModel)

我已经搜索了很多文档和示例,这些文档和示例解释了DataContext和Binding支持的语法和值。没有任何帮助

我只想知道如何设置DataContext(或在{Binding…}中指定指向我的视图对象的内容)。我尝试过“Self”和各种“RelativeSource”方法,但都不起作用。猜测没有效果,因为在解析XAML之前进入调试器的往返时间太长

谢谢

更新-我找到了一个让我感动的答案,但我还是不犹豫,所以我对下面的精美海报有后续问题

以下是有效的方法:

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

我在这里找到了这个提示:

他提出了不同的问题:如何“在代码隐藏中从XAML绑定到本地属性”


我仍然不理解下面提供的两种解决方案。因此,下面还有更多问题…

通常,当您使用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}" />

如果我的回答正确,您可以将app.xaml中的资源添加到所需的视图中

A.E:

xmlns:crap=“clr命名空间:Application.Views”
然后像
“{Binding MyProperty,source={StaticResource MyViewPage}”那样使用它。


希望这能起作用/有帮助

在我的视图的XAML中如何做同样的事情。我不知道如何为我的视图定义等效的“xmlns:crap”。即“Application.Views”是我的应用程序中的视图目录。但我相信,如果您想绑定到xaml中的对象,那么joe mcBride的解决方案会更好。当我第一次阅读您的答案时,我没有仔细考虑。我以为您提出了一些不同的建议,您的示例并不完整。但现在我看到您提供的解决方案与我在上面找到的相同。让我来看看问一个后续问题:在使用DataContext的示例中,DataContext的其他语法将进入根目录?我发誓我以前看到过一些东西,但记不得了。哦,关于我的ViewModel中的这些东西,你是对的。我很懒,然后我因为想知道如何做而分心。我现在正在将所有代码移回我的VM在Silverlight中,唯一的其他内置选项是RelativeSource={RelativeSourceTemplatedParent},但您只能在控件模板中使用。Silverlight 5应引入基于AncestorType的相对资源的使用能力,这允许绑定在VisualTree中查找特定类型。这是WPF中通常的做法。
xmlns:crap="clr-namespace:Application.Views"
<Application.Resources>
    <ResourceDictionary>
        <crap:MyViewPage x:Key="MyViewPage" />
    </ResourceDictionary>  
</Application.Resources>