38

我可以绑定到一个属性,但不能绑定到另一个属性中的一个属性。为什么不?例如

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}"...>
...
    <!--Doesn't work-->
    <TextBox Text="{Binding Path=ParentProperty.ChildProperty,Mode=TwoWay}" 
             Width="30"/>

(注意:我不想做主细节或任何事情。这两个属性都是标准的 CLR 属性。)

更新:问题是我的 ParentProperty 依赖于正在初始化的 XAML 中的对象。不幸的是,该对象在 XAML 文件中的定义比 Binding 晚,因此在 Binding 读取我的 ParentProperty 时该对象为空。由于重新排列 XAML 文件会破坏布局,我能想到的唯一解决方案是在代码隐藏中定义绑定:

<TextBox x:Name="txt" Width="30"/>

// after calling InitializeComponent()
txt.SetBinding(TextBox.TextProperty, "ParentProperty.ChildProperty");
4

3 回答 3

48

您也可以在 XAML 中设置DataContextfor TextBox(我不知道它是否是最佳解决方案,但至少您不必在 codeBehind 中手动执行任何操作,除了 implementation INotifyPropertyChanged)。当您TextBox已经DataContext(继承DataContext)时,您可以编写如下代码:

<TextBox 
   DataContext="{Binding Path=ParentProperty}"
   Text="{Binding Path=ChildProperty, Mode=TwoWay}" 
   Width="30"/>

请注意,在您的DataContextforTextBox尚未准备好之前,Text属性的绑定不会“建立”-您可以添加FallbackValue='error'为 Binding 参数-它将类似于指示器,将显示绑定是否正常。

于 2011-06-06T10:55:07.463 回答
27

我能想到的只是在创建ParentProperty之后正在更改Binding,并且它不支持更改通知。链中的每个属性都必须支持更改通知,无论是通过 aDependencyProperty还是通过实现INotifyPropertyChanged

于 2009-06-10T22:45:47.333 回答
4

ParentProperty 和您的班级是否都实现了 INotifyPropertyChanged?

    public class ParentProperty : INotifyPropertyChanged
    {
        private string m_ChildProperty;

        public string ChildProperty
        {
            get
            {
                return this.m_ChildProperty;
            }

            set
            {
                if (value != this.m_ChildProperty)
                {
                    this.m_ChildProperty = value;
                    NotifyPropertyChanged("ChildProperty");
                }
            }
        }

        #region INotifyPropertyChanged Members

        #endregion
    }

    public partial class TestClass : INotifyPropertyChanged
    {
        private ParentProperty m_ParentProperty;

        public ParentProperty ParentProperty
        {
            get
            {
                return this.m_ParentProperty;
            }

            set
            {
                if (value != this.m_ParentProperty)
                {
                    this.m_ParentProperty = value;
                    NotifyPropertyChanged("ParentProperty");
                }
            }
        }
}
    public TestClass()

    {
        InitializeComponent();
        DataContext = this;
        ParentProperty = new ParentProperty();
        ParentProperty.ChildProperty = new ChildProperty();

        #region INotifyPropertyChanged Members
        #endregion
    }
于 2009-06-11T00:58:11.497 回答