0

我有一个带有以下 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 中,我可以在用户控件的文本框中看到“我的输入”,但我似乎永远无法摆脱它。

4

3 回答 3

4
DependencyProperty.Register("InputValueProperty", ...

那应该是:

DependencyProperty.Register("InputValue", ...

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

于 2012-10-31T16:04:36.617 回答
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>

如果我在点击事件中抛出一个断点,我可以看到每个控件的绑定值。(如果您从中复制和粘贴,请务必将 WpfApplication4 更改为您的项目所调用的任何内容。

于 2012-10-31T19:46:36.227 回答
-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"); }
     }
    }

这将允许绑定获取属性

于 2012-10-31T16:06:20.577 回答