【问题标题】:Set Datasource of Textbox to Inner Class in xaml在xaml中将文本框的数据源设置为内部类
【发布时间】:2013-08-02 04:30:06
【问题描述】:

我有一个带有文本框的 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..../>

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

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

【问题讨论】:

  • 在此处查看答案中的示例:stackoverflow.com/questions/17995743/…
  • 那个答案做了我所做的,所以没有帮助。它不会在没有在代码隐藏中初始化的情况下在文本框中设置源

标签: c# wpf xaml binding


【解决方案1】:

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

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

请注意,我定义了一个名为 local 的新 xmlns 对象,它指向我试图创建的类所在的命名空间(在本例中为 Herp)。然后,在我的 @ 987654326@,我创建了一个Herp 的实例,并为DerpDerp 属性设置了一个值。另请注意,我为类指定了 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}"/>

【讨论】:

  • 好的,我想我明白了我错过了什么。在哪里创建新的 xmlns 对象,您只是将它设置为主窗口的外部命名空间,对吗?我在想,因为我有一个内部类,那需要有所不同。现在不需要在代码中创建一个新的 Herp 了吧?
  • 您在 XAML 的 Window 声明中创建 xmlns。是的,您不必再在代码中创建它了。
  • 还有一个问题。你说构造函数需要无参? O,我看到您只是调用该属性,并且在构造函数中不需要任何东西。我懂了。谢谢你。我认为内部类迷失了是我最大的问题
  • 好的,我将窗口资源设置为 xmlns 对象并引用了该属性,但它给了我这个错误:错误 1 ​​XML 命名空间“clr-namespace:MyProject”中不存在标签“Herp”。这是我之前遇到的相同错误,这就是我选择代码路线的原因。
  • @sisharp 您需要将MyProject 更改为您的Derp 类所在的命名空间。
猜你喜欢
  • 1970-01-01
  • 2015-11-09
  • 2011-02-21
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多