如何将DataContext定义从代码隐藏移动到XAML?

时间:2012-05-09 06:11:15

标签: c# wpf xaml datacontext

我定义了一个包含代码隐藏属性的对象,并希望将对象设置为xaml中的datacontext。

namespace WpfApplication4
{

    public partial class MainWindow : Window
    {
        public EquipInfo equip1;

        public MainWindow()
        {
            InitializeComponent();

            equip1 = new EquipInfo();
            //  setting here works fine but i want to do in xaml
            //textBox1.DataContext = equip1; 
        }
    }
}

这是xaml代码..

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox Text="{Binding Path=PIN}" Height="23" 
                 HorizontalAlignment="Left" Margin="172,208,0,0" 
                 Name="textBox1" VerticalAlignment="Top" Width="120" />
    </Grid>
</Window>

3 个答案:

答案 0 :(得分:3)

您可以通过XAML将DataContext设置为公共属性。 blindmeis就如何做到这一点给出了一个很好的例子。

您在Post中所做的不是设置DataContext,而是将Control的Text属性绑定到窗口的Property。这仅在设置了DataContext时有效。另一种方法,如果你不想做MVVM(我推荐的话),就是在你的Binding中引用特定的元素:

1。)将成员更改为AutoProperty或类似的

public EquipInfo equip1 {get;set;}

2。)给你的窗口命名

<Window x:Class="WpfApplication4.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="myWin"
    Title="MainWindow" Height="350" Width="525">

2。)按实例名称访问窗口属性

<TextBox Text="{Binding ElementName=myWin, Path=equip1.PIN}"/>

另一方面,使用MVVM会更好真的

答案 1 :(得分:1)

在代码隐藏中创建equipinfo类时为什么不在那里设置datacontext?

然而你可以在xaml中创建一个datacontext(那时你不需要代码隐藏的东西)

<TextBox Text="{Binding Path=PIN}">
     <TextBox.DataContext>
         <local:equip1/>
      </TextBox.DataContext>
 </TextBox>

但请查看MVVM模式

答案 2 :(得分:1)

在代码隐藏中创建equipinfo类时,为什么不在那里设置datacontext?

MVVM的重点是使用viewmodel代理从代码中分离UI。如果你要引用ui元素来设置它的datacontext,你也可以引用它来设置它的值并忘记mvvm。