为什么依赖属性不返回其值?

时间:2012-10-31 15:58:35

标签: c# wpf user-controls

我有一个带有以下Xaml的MyUserControl:

<TextBox Text="{Binding InputValueProperty}" />

在MyUserControl.xaml.cs中我有:

public string InputValue
{
    get { return (string)GetValue(InputValueProperty); }
    set { SetValue(InputValueProperty, value); }
}
public static readonly DependencyProperty InputValueProperty = 
    DependencyProperty.Register("InputValueProperty", typeof(string), 
    typeof(MyUserControl));

在我的MainWindow.xaml中,我创建了一个用户控件:

<local:MyUserControl InputValue="My Input" />

稍后在我的MainWindow.xaml.cs中,我试图访问此字符串。 MyUserControl的所有实例都包含在List中,我使用foreach访问它们。

string temp = userControl.InputValue;

这始终为空。在我的MainWindow.xaml中,我可以在用户控件的文本框中看到“我的输入”,但我似乎无法将其从那里拿出来。

3 个答案:

答案 0 :(得分:4)

DependencyProperty.Register("InputValueProperty", ...

应该是:

DependencyProperty.Register("InputValue", ...

XAML取决于属性的注册名称,而不是属性访问者的名称。

答案 1 :(得分:0)

看起来问题在于您的绑定。这是一个使用相对源绑定模拟代码的工作示例:

这是用户控件:

  public partial class MyUserControl : UserControl
  {
    public MyUserControl()
    {
      InitializeComponent();
    }

    public string InputValue
    {
      get { return (string)GetValue(InputValueProperty); }
      set { SetValue(InputValueProperty, value); }
    }
    public static readonly DependencyProperty InputValueProperty =
        DependencyProperty.Register("InputValueProperty", typeof(string),
        typeof(MyUserControl));
  }
<UserControl x:Class="WpfApplication4.MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication4" Height="30" Width="300">
    <Grid>
       <TextBox Text="{Binding Path=InputValue, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:MyUserControl}}}" />
    </Grid>
</UserControl>

这是窗口:

  public partial class Window1 : Window
  {
    public Window1()
    {
      InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
      string text1 = ctrl1.InputValue;
      string text2 = ctrl2.InputValue;
      string text3 = ctrl3.InputValue;
//breakpoint here
    }
  }

<Window x:Class="WpfApplication4.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication4" Title="Window1" Height="300" Width="300">
    <Grid>
    <StackPanel>
      <local:MyUserControl x:Name="ctrl1" InputValue="My Input" />
      <local:MyUserControl x:Name="ctrl2" InputValue="2" />
      <local:MyUserControl x:Name="ctrl3" InputValue="3" />
      <Button Click="Button_Click" Height="25" Content="debug"/>
      </StackPanel>
    </Grid>
</Window>

如果我在click事件中抛出一个断点,我可以看到每个控件的绑定值。 (如果您从中复制并粘贴,请确保将WpfApplication4更改为您调用的项目。

答案 2 :(得分:-1)

您需要在具有属性

的类上实现INotifyPropertyChanged
    public class YourClassThatHasTheInputValuePropertyInIt: INotifyPropertyChanged
    {
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String propertyName)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }

            public string InputValue
            {
                get { return (string)GetValue(InputValueProperty); }
                set { SetValue(InputValueProperty, value);
                      NotifyPropertyChanged("InputValue"); }
     }
    }

这将允许绑定获取属性