WPF DataBinding来控制属性

时间:2015-06-04 12:16:12

标签: c# wpf binding

我有一个问题,即我没有通过绑定接收更新。

我有一个标签,它通过DataContext绑定到TextBox属性的ExtentWidth。

我的绑定最初有效,并在标签中显示值0,但在此之后它不会更新。

ExtentWidth是一个只读属性,我不确定这是否会以任何方式影响绑定,但我有一个标签在设置时绑定到文本,所以我知道它可以接收更新。 (按钮更新文本和标签已更新)

下面是一些代码来展示我的问题。

的Xaml

<Window x:Class="TestHarnesses.Views.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <StackPanel>
            <ContentPresenter x:Name="ContentPresenter" Content="{Binding}"></ContentPresenter>
            <Label x:Name="lblExtentWidth" 
               Content="{Binding ExtentWidth, Mode=OneWay}"/>
            <Label x:Name="lblText" 
               Content="{Binding Text, Mode=OneWay}"/>
            <Button Content="Different Jibber Jabber" Click="ButtonBase_OnClick"/>
        </StackPanel>
    </Grid>
</Window>

背后的代码

using System.Windows;
using System.Windows.Controls;

namespace TestHarnesses.Views
{
    ///
    <summary>
        /// Interaction logic for Window1.xaml
    ///</summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            TextBox tb = new TextBox(){Text = "Jibber Jabber"};
            this.TestTextBox = tb;
        }


        public TextBox TestTextBox
        {
            get { return (TextBox)GetValue(TestTextBoxProperty); }
            set { SetValue(TestTextBoxProperty, value); }
        }

        // Using a DependencyProperty as the backing store for TestTextBox.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TestTextBoxProperty =
            DependencyProperty.Register("TestTextBox", typeof(TextBox), typeof(Window1), new PropertyMetadata(OnTestTextBoxProperty));

        private static void OnTestTextBoxProperty(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((Window1) d).DataContext = (TextBox) e.NewValue;
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            TestTextBox.Text = "Different Jibber Jabber";
        }


    }
}

1 个答案:

答案 0 :(得分:1)

您的视图未被通知有关ExtentWidth属性的更改,因为ExtentWidth不是DependencyProperty,TextBox类也没有实现INotifyPropertyChanged。此外,似乎没有与此属性关联的相应Changed事件。

如果您想使用最新的ExtentWidth自动更新视图,那么您需要收听同时更新的其他属性/事件(可能是SizeChanged事件?)。