绑定到UserControl的属性无效

时间:2019-08-22 09:51:44

标签: c# wpf binding

我有一个自定义的TextBox,打算将其包含在另一个UserControl中,但是为它设置Binding时,它只是不绑定。

为了简化起见,我简化了代码。

我的自定义文本框:

<UserControl DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" />
</UserControl>
partial class CustomTextBox : UserControl 
{
    public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set
            {
                SetValue(TextProperty, value);
            }
        }

        public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
            "Text",
            typeof(string),
            typeof(CustomTextBox),
            new PropertyMetadata(String.Empty));
}

此绑定按预期方式工作。在另一个UserControl或Window中使用CustomTextBox时,我可以按预期访问属性。

以下代码块描述了使用CustomTextBox的UserControl和具有我要将Text绑定到的属性的对应ViewModel。

<UserControl>
    <UserControl.DataContext>
        <vm:MyViewModel />
    </UserControl.DataContext>
    <local:CustomTextBox Text="{Binding FooBar, UpdateSourceTrigger=PropertyChanged}" />
</UserControl>
public class MyViewModel : INotifyPropertyChanged
{
    private string _fooBar;
    public string FooBar
        {
            get { return _fooBar = (_fooBar ?? ""); }
            set
            {
                _fooBar = value; OnPropertyChanged();
            }
        }

    public event PropertyChangedEventHandler PropertyChanged;
}

当我想将Text属性绑定到另一个UserControl中的ViewModel时,恰好发生了我的问题,但是它不起作用。在这种情况下,我尝试将Text属性绑定到FooBar类的MyViewModel属性,但是对Text属性的更改不会反映在{{1 }}属性,反之亦然。但是,当我将鼠标悬停在XAML视图中的绑定上时,它显示了属性的类型,因此我无法确切地看到这里出了什么问题。
我最好的猜测是,它与访问同一属性的两个绑定有关。

1 个答案:

答案 0 :(得分:0)

修改DP注册以包含FrameworkPropertyMetadataOptions.BindsTwoWayByDefault选项

public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
    "Text",
    typeof(string),
    typeof(CustomTextBox),
    new FrameworkPropertyMetadata(String.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));