使用绑定在usercontrol中设置文本框的text属性 - WPF

时间:2013-12-10 13:06:45

标签: c# wpf binding

我有一个包含文本框的用户控件,并在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需要是一个依赖属性,但如果我这样做,我无法解决如何将值传递给文本框。

我该如何解决这个问题。

2 个答案:

答案 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; }
    }
}

执行结果(在第一个控件中输入内容后):

Result

答案 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为您完成繁重的工作。