0

我有一个带有文本框的 wpf gui 页面,该文本框绑定到我的窗口中的内部类的属性。我已经定义了要绑定的文本框,如下所示:

XAML:

 <TextBox Name="shhh" Text="{Binding Path=derpDerp, Mode=OneWay,
         UpdateSourceTrigger=PropertyChanged}" />

代码隐藏:

namespace ...
{
    public partial class MainWindow : Window
    {
        innerclass definition....

        public Herp derp;

        public MainWindow()
        {
            ...
            derp = new Herp();
            shhh.DataContext = derp;
            ...
        }

        {code that changes derp.derpDerp}
    }
}

内部类:

public class Herp : INotifyPropertyChanged
{
    private secret = "";

    public event PropertyChangedEventHandler PropertyChanged;

    public Herp(string derp)
    {
        secret = derp;
    }

    public string derpDerp
    {
        get{ return secret; }
        set{ secret = value; onPropertyChanged("derpDerp"); }
    }

    private void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }

我想知道是否可以在 xaml.xml 中声明文本框的来源。我见过很多例子说将文本框设置为父级的数据上下文,如窗口或文本框周围的容器。但是,如果只有 1 个控件需要数据,我觉得不是很直观。如果我有几个文本框和一个带有数据上下文的堆栈面板,那将是有意义的。

在我的实现中,我在代码中创建对象并将数据上下文设置为文本框。是否有等效的 xaml 解决方案?

就像是:

<TextBox Source="something" Path=derpDerp..../>

无需将数据上下文设置为容器或窗口。另外,我不知道如何将窗口的数据上下文正确设置为我的属性,因为它是一个内部类,其命名空间为 namespace.the 窗口类或类似的东西。

给文本框一个数据源的正确方法是什么,或者如果不可能,我如何引用内部类并将源设置为窗口?

4

1 回答 1

1

是的,您可以创建一个类的实例并将其设置为DataContextXAML 中的任何控件。一般的解决方案是这样的:

<Window x:Class="MyProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyProject">

<Window.Resources>
    <local:Herp DerpDerp="This is Derp!!" x:Key="derp"/>
</Window.Resources>
<Grid>
    <TextBox Text="{Binding Source={StaticResource derp}, Path=DerpDerp}"/>
</Grid>

请注意,我定义了一个xmlns名为 的新对象local,它指向我试图创建的类所在的命名空间(在本例中,它是Herp)。然后,在我的 中Window.Resources,我创建了一个 的实例Herp,并为DerpDerp财产。另请注意,我给了班级 a key,这是必要的TextBox找到它并绑定到它所必需的。

重要说明:为了让您能够在 XAML 中创建类的实例,该类需要有一个无参数构造函数!所以我Herp做了一点改变:

namespace MyProject
{
  public class Herp : INotifyPropertyChanged
  {
    private string m_derp;

    public Herp()
    {

    }

    public string DerpDerp
    {
        get { return m_derp; }
        set { m_derp = value; OnPropertyChanged("DerpDerp"); }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
  }
}

最后,在您的 中TextBox,您使用绑定中的Source元素绑定到对象:

<TextBox Text="{Binding Source={StaticResource derp}, Path=DerpDerp}"/>
于 2013-08-01T18:51:35.097 回答