【问题标题】:How to move the DataContext definition from code-behind to XAML?如何将 DataContext 定义从代码隐藏移动到 XAML?
【发布时间】:2012-05-09 06:11:14
【问题描述】:

我在代码隐藏中定义了一个包含属性的对象,并且想在 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>

【问题讨论】:

标签: c# wpf xaml datacontext


【解决方案1】:

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

您在 Post 中所做的不是设置 DataContext,而是将控件的 Text 属性绑定到窗口的属性。这仅在设置了 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 会更好。

【讨论】:

  • 感谢您的回答。我不知道对象必须是属性,并且 Path 可以采用点表示法。但是,虽然 EquipInfo 继承了 INotifyPropertyChanged 接口,但更改 PIN 属性不会导致文本框,并且我必须在 InitializeComponent() 之前实例化 EquipInfo 才能看到绑定工作。有什么问题吗?
【解决方案2】:

当您在代码隐藏中创建您的装备信息类时,为什么不在那里设置数据上下文?

尽管如此,您可以在 xaml 中创建数据上下文(那时您不需要代码隐藏的东西)

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

但请查看 MVVM 模式

【讨论】:

    【解决方案3】:

    当您在代码隐藏中创建您的装备信息类时,为什么不在那里设置数据上下文?

    MVVM 的全部意义在于使用视图模型代理将 UI 与后面的代码分开。如果你要引用 ui 元素来设置它的数据上下文,你也可以引用它来设置它的值而忘记 mvvm。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2012-07-15
      • 2011-07-04
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 2018-11-16
      相关资源
      最近更新 更多