30

如何在 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,而不是在代码中。

4

7 回答 7

23

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

关注代码:


<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>

于 2009-03-04T16:58:23.520 回答
10

以下怪物在 Silverlight 4 中有效

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
于 2010-07-21T13:44:08.150 回答
6
<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>
于 2010-01-30T13:58:46.960 回答
2

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

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

其中HPVM是this的公共成员->您的表单等。

在 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>
于 2009-03-03T15:23:48.230 回答
1

在 Silverlight 4 中,我可以通过执行以下操作来完成这项工作:

给 Page/UserControl 一个 x:Name="myPage"

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

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

我还没有尝试过使用 DataContext 进行此操作,但知道您可以为 DataContext 执行元素到元素绑定,就像我对上下文基于页面上某些其他下拉列表的选定项的网格执行此操作一样。

于 2011-01-19T21:39:25.187 回答
0

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

你必须通过代码来完成。

于 2009-03-03T17:43:48.613 回答
0
<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
于 2011-08-13T21:29:06.810 回答