【问题标题】:Silverlight - Setting DataContext in XAML rather than in constructor?Silverlight - 在 XAML 中而不是在构造函数中设置 DataContext?
【发布时间】:2010-10-11 01:05:03
【问题描述】:

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

【问题讨论】:

    标签: silverlight datacontext


    【解决方案1】:

    试试这样的.....

    <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 在哪里。在代码方法中,那是什么“这个”。部分可以。 HPVM 是类的一个属性。我无法找出引用实例化类以访问 HPVM 的正确方法。
    • 第二个代码示例确实有效,但在 XAML 中创建对象。它仍然没有解决从 XAML 访问构造函数创建的对象实例的问题。最好的我可以告诉它不能完成。如果在代码中创建对象,则必须从代码中设置 DataContext。
    【解决方案2】:

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

    你必须通过代码来完成。

    【讨论】:

      【解决方案3】:

      克里斯给出的答案很好。 我已经测试过了,它对我有用。 您可以在 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>

      【讨论】:

      • 如果我在 XAML 中实例化 ViewModel 类,我还可以在代码隐藏构造函数中引用吗?我问的原因是,在向用户显示表单之前,我目前在构造函数中的 ViewModel 上设置了一些值。
      • 是的,你可以。您可以执行以下操作: var aCustomer = this.Resources["Cust"] as Customer; aCustomer.Name = "abc";
      • 我忘记添加 x:Name 属性。 x:Key 在 XAML 中工作,x:Name 使对象对代码可见。
      • 是的,它确实有效,但是创建 XAML 中的对象。它仍然没有解决从 XAML 访问构造函数创建的对象实例的问题。最好的我可以告诉它不能完成。如果在代码中创建对象,则必须从代码中设置 DataContext。
      • 我同意你的观点,这是不可能的。没有语法支持。
      【解决方案4】:
      <UserControl.DataContext>
        <vm:ThisUCViewModel />
      </UserControl.DataContext>
      

      【讨论】:

        【解决方案5】:

        以下怪物在 Silverlight 4 中有效

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

        【讨论】:

        • 我只是在嘴里吐了一点。
        【解决方案6】:

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

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

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

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

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

        【讨论】:

        • 太棒了!这当然为我解决了。非常感谢。
        【解决方案7】:
        <UserControl.Resources>
          <ResourceDictionary>
             <vm:YourModelx:Key="myModel"/>
          </ResourceDictionary>
        </UserControl.Resources>
        <UserControl.DataContext>
           <Binding Source="{StaticResource myModel}"/>
        </UserControl.DataContext>
        

        【讨论】:

        • 你只需要添加
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 2014-07-06
        相关资源
        最近更新 更多