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