【问题标题】:Binding to a property within an instance绑定到实例中的属性
【发布时间】:2011-07-02 10:35:06
【问题描述】:

我正在从事一个从后端获取数据的项目,即数据不断动态变化,前端不必关心。 我需要将此数据公开给 wpf,以便有人可以通过表达式混合将事物绑定到 wpf 中的数据。只读很好。 简而言之,如果我的控制流程大致如下,我如何在类型为“Foo”的类“foo”的实例中对属性 Foostring 进行数据绑定:

 public partial class Window1 : window
 {
      public Window1()
      {
           InitializeComponent();
           Foo foo = new foo;
      }
   // my text box is defined in the xaml of this window.

 }

public ref class Foo
{
     Foo()
    {
         FooProperty = "work,dammit";
    }
    private string _foostring="";
    public string FooProperty
    {
       get {return _foostring;}
        set {foostring=value;} 

    }
}

如果在 Foo 类的构造函数中我在文本框上设置绑定,并且如果我从 INotifyPropertyChanged 继承并在 FooProperty 的设置上引发事件,我可以让事情正常工作。 但是,这不会将此变量公开给表达式混合——它并不是真正设置数据源。我试图在 xaml 中设置绑定,它编译但不更新。 任何帮助将不胜感激!

【问题讨论】:

  • 我很困惑。您想从 xaml 到属性进行简单的绑定吗?这应该没问题:在Foo 类中实现INotifyPropertyChanged,将这个类的实例设置为这个窗口的DataContext,然后绑定到这个属性。请记住,每次属性更改时,您都需要引发 PropertyChanged 事件。我看不出有什么问题。我不知道你说的是什么意思:“在 Foo 类的构造函数中,我在文本框上设置了绑定”——这绝对不是,你应该做什么。
  • 谢谢,这正是我所需要的。
  • 我需要做的是在 xaml 中实例化对象,然后在 c++ 中引用它。我在 c++ 中实例化它并在 xaml 中引用它,当我创建一个静态资源时,xaml 正在创建它自己的实例并且没有得到我的任何更新。为了子孙后代,最终的 xaml 最终成为上面的详细解决方案。
  • 如果您添加您的解决方案作为答案,我会选择它作为选择的解决方案!
  • 如果 Pako 不打算发布您应该自己发布的答案,也请尽快接受。

标签: c# wpf xaml data-binding binding


【解决方案1】:

[Rokujolady 的回答]
为了后代,我已经发布了解决方案: 当我应该从 xaml 实例化时,我正在从 c# 实例化对象 foo,因为 xaml 正在创建自己的实例,该实例没有被更新,因为我正在更新 c# 实例化的实例。显然,您不能从 xaml 引用在 c# 中创建的对象,但您可以从 c# 引用在 xaml 中创建的对象。代码最终是这样的: XAML:

<Window.Resources>
<local:Foo x:Name "foo" x:Key="FooDataSource" d:IsDataSource="True"/>
...
</Window.Resources>
<Grid x:name="blah">
<Grid DataContext="{Binding Source={StaticResource FooDataSource}}">
<TextBlock x:Name="myText" Text="{Binding FooProperty, Mode=Default}"></TextBlock></Grid>

C# 代码如下所示:

public partial class Window1:window
{
     Foo myFooVariable = null;
     public Window1()
     {
          InitializeComponent();
          myFooVariable = this.Resources["FooDataSource"] as Foo;
          myFooVariable.FooString = "Work, Dammit";
     }
}

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2013-06-26
    • 2016-05-02
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多