我有一个包含文本框的用户控件,并在usercontrol中创建了一个get / set来获取/设置文本框的text属性。
public class OpenFileControl : UserControl
{
StackPanel sp;
public TextBox tb;
public string Text { get { return tb.Text; } set { tb.Text = value; } }
然后,我希望稍后根据绑定设置此值 -
<gX3UserControls:OpenFileControl Text="{Binding Value}" />
但我得到以下异常 无法在“OpenFileControl”类型的“Text”属性上设置“绑定”。 '绑定'只能在DependencyObject的DependencyProperty上设置。
经过一些调查似乎Text需要是一个依赖属性,但如果我这样做,我无法解决如何将值传递给文本框。
我该如何解决这个问题。
答案 0 :(得分:4)
考虑使用这样的东西。
控制XAML:
<UserControl x:Class="WpfTestBench.OpenFileControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},
Path=Filename, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</UserControl>
控制代码隐藏:
using System.Windows;
namespace WpfTestBench
{
public partial class OpenFileControl
{
public static readonly DependencyProperty FilenameProperty =
DependencyProperty.Register("Filename", typeof (string), typeof (OpenFileControl));
public OpenFileControl()
{
InitializeComponent();
}
public string Filename
{
get { return (string)GetValue(FilenameProperty); }
set { SetValue(FilenameProperty, value); }
}
}
}
主要XAML:
<Window x:Class="WpfTestBench.OpenFileWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfTestBench="clr-namespace:WpfTestBench"
Title="OpenFileWindow" Width="300" SizeToContent="Height">
<StackPanel>
<wpfTestBench:OpenFileControl x:Name="In" Filename="{Binding SelectedFilename, UpdateSourceTrigger=PropertyChanged}" />
<wpfTestBench:OpenFileControl x:Name="Out" Filename="{Binding ElementName=In, Path=Filename}" />
</StackPanel>
</Window>
主要代码隐藏:
namespace WpfTestBench
{
public partial class OpenFileWindow
{
public OpenFileWindow()
{
InitializeComponent();
DataContext = this;
}
public string SelectedFilename { get; set; }
}
}
执行结果(在第一个控件中输入内容后):
答案 1 :(得分:0)
如果将依赖项属性定义为静态属性和实际属性,则可以在属性体中编写所需的任何代码。
public const string TextPropertyName = "Text";
public string Text
{
get
{
return (string)GetValue(TextProperty);
}
set
{
SetValue(TextProperty, value);
}
}
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
TextPropertyName,
typeof(string),
typeof(MyControl),
new UIPropertyMetadata(false));
在getter和setter中你可以做类似textBox1.Text = value;但是使用绑定到属性可能会更好。 MVVM框架经常使这种事情变得轻松。您可能会发现更多成功定义ViewModel(例如,具有适当FielPath变量的类),并将新UserControl的DataContext设置为ViewModel类的实例,使用Bindings为您完成繁重的工作。