How to move the DataContext definition from code-behind to XAML?

时光毁灭记忆、已成空白 提交于 2020-01-03 02:57:33

问题


I defined an object which contains properties in code-behind and, want to set the object to datacontext in xaml.

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; 
        }
    }
}

here's xaml code..

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

回答1:


You can set the DataContext via XAML to a public property. blindmeis has given a good example on how to do this.

What you did in your Post was not setting the DataContext, but binding the Text Property of your Control to a Property of the window. This only works if a DataContext is set. Another way to do that, if you don't want to do MVVM (which I'd recommend, though), is referencing specific Elements in your Binding:

1.) Alter member to AutoProperty or similar

public EquipInfo equip1 {get;set;}

2.) Give your window a name

<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.) Access Window Properties by instance name

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

On a side note, it would really be better to use a MVVM instead.




回答2:


when you create your equipinfo class in codebehind why not setting the datacontext there?

nevertheless you can create a datacontext in xaml (you did not need the codebehind stuff then)

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

but please look at the MVVM pattern




回答3:


When you create your equipinfo class in codebehind why not setting the datacontext there?

The whole point of MVVM is to seperate UI from code behind using a viewmodel proxy. If you are going to reference the ui element to set its datacontext you might just as well reference it to set its value and forget about mvvm.



来源:https://stackoverflow.com/questions/10510673/how-to-move-the-datacontext-definition-from-code-behind-to-xaml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!