Silverlight - 在XAML中而不是在构造函数中设置DataContext?

时间:2009-03-03 15:19:09

标签: silverlight datacontext

如何在XAML中而不是在构造函数中设置Grid上的DataContext?

以下是我在构造函数中的操作方法(LayoutRoot是XAML中定义的XAML Grid):

this.LayoutRoot.DataContext = this.HPVM;

我更喜欢在XAML中正确执行,但我不知道如何在XAML中引用HPVM对象。 HPVM是USerControl类的公共属性。

它如上所列工作正常,但我再次想知道如何在XAML中使用UserControl类的属性,而不是总是必须在代码中执行它。

以下是所有相关代码:

  <UserControl x:Class="SilverlightApplication1.SLHolePattern" x:Name="HolePatternsControl"
    xmlns="http://schemas.microsoft.com/client/2007"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"    
    xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls"
    xmlns:local="clr-namespace:SilverlightApplication1"    
    xmlns:GeoPatterns="clr-namespace:GeoPatterns"
    Height="700">


    <UserControl.Resources>
    ...

这是我的构造函数,其中当前设置了DataContext:

namespace SilverlightApplication1
{
    public partial class SLHolePattern : UserControl, INotifyPropertyChanged
    {
        public HolePatternsViewModel HPVM;

        public SLHolePattern()
        {
            InitializeComponent();

            this.HPVM=new HolePatternsViewModel();
            this.LayoutRoot.DataContext = this.HPVM;
            ...more code here
        }

一切正常,但我只是想学习如何在XAML中设置DataContext,而不是在代码中。

7 个答案:

答案 0 :(得分:24)

克里斯给出的答案很好。 我已经测试过,它对我有用。 您可以在XAML中实例化您的类(在UserControl.Resources中)和 然后将datacontext绑定到静态资源。

关注代码:


<UserControl ...>
    <UserControl.Resources>
       <myNS:MyClass x:Name="TheContext" x:Key="TheContext"></myNS:MyClass>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource TheContext}" >
        <TextBlock Text="{Binding Path=Field1}">
        </TextBlock>
    </Grid>
</UserControl>

答案 1 :(得分:10)

以下怪物适用于Silverlight 4

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">

答案 2 :(得分:6)

<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>

答案 3 :(得分:2)

尝试这样的事情......

<Grid DataContext="{Binding Path=HPVM}">
</Grid>

其中HPVM是此公共成员 - &gt;你的表格等。

在xaml中创建类的实例,方法是在资源部分添加类似的内容....(不要忘记添加xmlns命名空间)

<my:bogart x:Key="franken"/>

然后,将数据上下文绑定到刚刚添加的静态资源....

<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource franken}">
    <TextBox  Background="Red" Foreground="White" Text="{Binding Path=sum}"  />
</Grid>

答案 4 :(得分:1)

在Silverlight 4中,我通过执行以下操作来实现此功能:

给Page / UserControl一个x:Name =“myPage”

在您的控件绑定中使用常规元素出价语法。在我的情况下,我想绑定到我的ItemsSource属性后面的代码中的可观察对象集合:

<ComboBox 
    ItemsSource={Binding ElementName=myPage, Path=MyObservableObjectList, Mode=TwoWay}

我没有尝试使用DataContext,但是我知道你可以对DataContext的元素绑定执行元素操作,因为我为网格执行此操作,其上下文基于页面上某些其他下拉菜单的选定项目。

答案 5 :(得分:0)

这是不可能的(在WPF中可以使用{Binding RelativeSource={RelativeSource Self}},但Silverlight更受限制。

你必须通过代码来完成。

答案 6 :(得分:0)

<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>