【问题标题】:How to bind a property to the property of another class (with no UI Control)?如何将属性绑定到另一个类的属性(没有 UI 控件)?
【发布时间】:2015-06-15 02:26:12
【问题描述】:

我在 Google 上花费数小时研究我的简单任务。 我正在尝试将我的变量 TestString 绑定到 TestClass.MeinString

如果我单击“tb_tbBinding”按钮,TestString 和 TestClass.MyString 应该保持相同的值。

相关代码:

public partial class Window_Test : Window, INotifyPropertyChanged
{
    public Window_Test()
    {
        InitializeComponent();
        DataContext = this;

        // Trying to bind TestClass.MeinString to TestString
        BindingOperations.SetBinding(TestClass, BindingTestClass.MeinStringProperty, new Binding("TestClass.MeinString") { UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
    }



    string _TestString = "Hello World!";
    public string TestString
    {
        get
        {
            return _TestString;
        }
        set
        {
            _TestString = value;
            OnPropertyChanged("TestString");
        }
    }

    BindingTestClass _TestClass = new BindingTestClass("Hallo Lukas!");
    public BindingTestClass TestClass
    {
        get
        {
            return _TestClass;
        }
        set
        {
            _TestClass = value;
            OnPropertyChanged("TestClass");
        }
    }

    private void btn_testclasschanger_click(object sender, RoutedEventArgs e)
    {
        TestClass.MeinString = "Changed String!";
    }

    private void btn_teststringchanger_click(object sender, RoutedEventArgs e)
    {
        TestString = "Changed Class!";
    }

}

我的自定义类:

 public class BindingTestClass : DependencyObject, INotifyPropertyChanged
    {
        public BindingTestClass(string myString)
        {
            MeinString = myString;
        }

        public string MeinString
        {
            get
            {
                return (string)GetValue(MeinStringProperty);
            }
            set
            {
                SetValue(MeinStringProperty, value);
                OnPropertyChanged("MeinString");
            }
        }

        public static readonly DependencyProperty MeinStringProperty = DependencyProperty.Register("MeinString", typeof(string), typeof(BindingTestClass), new FrameworkPropertyMetadata()
        {
            BindsTwoWayByDefault = true,
            DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
        });

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

谢谢你们!

【问题讨论】:

  • 你能详细解释一下你想做什么吗?
  • 我想保持内部变量不变。示例:我有一个 Foo 类的对象,它具有一些属性,我想将此对象的某个属性绑定到我的类 Bar 的某个属性。

标签: c# wpf binding dependency-properties dependencyobject


【解决方案1】:

尝试设置绑定的Source 属性

BindingOperations.SetBinding(TestClass, BindingTestClass.MeinStringProperty, 
    new Binding("TestString") { Source=this, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });

默认情况下,绑定使用.DataContext 作为绑定的源,但是在您的情况下,TestClass 没有将其.DataContext 设置为任何值。事实上,我什至不确定这是否是 DependencyObject 上的有效属性。

通常.DataContext 是从 WPF 可视化树中对象的父级继承而来,但由于 TestClass 不是可视化树的一部分,因此它没有什么可继承的。

【讨论】:

  • @MisterPresident 没问题,很高兴这对你有用 :)
  • MisterPresident 接受它作为答案,让社区受益。
猜你喜欢
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2010-11-14
  • 2013-04-20
  • 1970-01-01
相关资源
最近更新 更多