我有一个带有以下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中,我可以在用户控件的文本框中看到“我的输入”,但我似乎无法将其从那里拿出来。
答案 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"); }
}
}
这将允许绑定获取属性