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

30

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

以下是我在构造函数中的做法(LayoutRoot是在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个回答

23

Chris给出的答案完全可行。 我已经测试过并且对我起作用。 您可以在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>

这段代码是一个用户控件的代码,其中涉及到了it技术方面的内容。在这个用户控件中,引用了名为"MyClass"的自定义命名空间,并且将它声明为"TheContext"。然后设置了一个名为"LayoutRoot"的网格。此外,还使用了数据上下文来绑定名为"Field1"的属性,用于在文本块中显示相应的数据。

如果我在XAML中实例化ViewModel类,我仍然可以在代码后台构造函数中引用它吗?我之所以问这个问题是因为我目前在构造函数中设置了一些ViewModel上的值,然后将表单显示给用户。 - MattSlay
3
可以的。您可以按照以下步骤操作: var aCustomer = this.Resources["Cust"] as Customer; aCustomer.Name = "abc"; (注:这段代码中的"as Customer"是一种类型转换,将资源"Cust"转换为顾客类型。) - Klinger
2
我忘记添加x:Name属性了。 x:Key在XAML中起作用,而x:Name使对象对代码可见。 - Klinger
1
是的,它确实可以工作,但是在XAML中创建对象。它仍然没有解决从XAML访问构造函数创建的对象实例的问题。据我所知,这是不可能完成的。如果对象是在代码中创建的,则必须从代码中设置DataContext。 - MattSlay
我同意你的看法,这是不可能完成的。没有语法支持它。 - Klinger
在XAML中实例化对象如果使用Resources["..."]方式可以工作。 使用x:Name暴露资源将无法工作, 因为自动生成的类无法正确检索对象(在我看来是这样)。 请参见我的帖子:http://silverlight.net/forums/t/77509.aspx。 - Klinger

10

下面这个庞然大物在 Silverlight 4 中可行。

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

2
我刚才有点恶心,感觉要吐了。 - Cheeso

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

2
尝试像这样做......
<Grid DataContext="{Binding Path=HPVM}">
</Grid>

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

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

不起作用。必须有一条路径来指示HPVM的位置。在代码方法中,“this.”部分就是这样做的。HPVM是类的属性。我无法找到引用实例化类以访问HPVM的正确方法。 - MattSlay
第二个代码示例确实可以工作,但是它在XAML中创建对象。它仍然没有解决从XAML访问构造函数创建的对象实例的问题。据我所知,这是不可能完成的。如果对象是在代码中创建的,则必须从代码中设置DataContext。 - MattSlay

1
在Silverlight 4中,我能够通过以下方式使其工作:
给页面/用户控件一个x:Name="myPage"
在您的控件绑定中使用正常的元素绑定语法。在我的情况下,我想将其绑定到我的ItemsSource属性中代码后台的可观察对象集合:
<ComboBox 
    ItemsSource={Binding ElementName=myPage, Path=MyObservableObjectList, Mode=TwoWay}

我尚未尝试过使用DataContext进行这项操作,但我知道您可以对DataContext进行元素绑定,因为我在处理页面上某些其他下拉列表的选定项所基于的网格时会使用该功能。


太棒了!这确实为我解决了问题。非常感谢。 - SGarratt

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

你只需要添加 <ResourceDictionary>。 - Jacfay

0

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

你必须通过代码来实现它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接