将自定义类型属性绑定到自定义控件

本文关键字:自定义控件 绑定 属性 自定义 类型 | 更新日期: 2023-09-27 17:57:02

我正在尝试将自定义类型的属性绑定到用户控件(在我们的示例中,我们将其称为DataContextOne)。此自定义类型由两个字符串组成。

然后,我有一个要将此自定义类型绑定到的用户控件。

奇怪的是,如果我放入我的控件 2 个字符串属性,然后尝试从我的自定义类型绑定每个字符串,它就会起作用。但是,当我在自定义控件中仅创建一个 DataContextOne 属性并尝试绑定到它时,没有任何反应(= 用户控件中的 null)。

这是我的代码

DataContextOne

public class DataContextOne : INotifyPropertyChanged
{
    protected virtual void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private string _title;
    public string Title 
    {
        get { return _title; }
        set
        {
            if (_title != value)
            {
                _title = value;
                TitleModified = _title + " modified";
                RaisePropertyChanged("Title");
            }
        }
    }
    private string _titlemodified;
    public string TitleModified
    {
        get { return _titlemodified; }
        set
        {
            if (_titlemodified != value)
            {
                _titlemodified = value;
                RaisePropertyChanged("TitleModified");
            }
        }
    }
}

有效的绑定

用户控件

public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();
        (Content as FrameworkElement).DataContext = this;
    }
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
    public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
            "Text",
            typeof(string),
            typeof(MyUserControl),
            null);
    public string TextModified
    {
        get { return (string)GetValue(TextModifiedProperty); }
        set { SetValue(TextModifiedProperty, value); }
    }
    public static readonly DependencyProperty TextModifiedProperty = DependencyProperty.Register(
            "TextModified",
            typeof(string),
            typeof(MyUserControl),
            null);
}

主窗口

代码隐藏

public partial class MainWindow : Window
{
    Random Rnd = new Random();
    DataContextOne dtone = new DataContextOne();
    public MainWindow()
    {
        InitializeComponent();
        dtone.Title = Rnd.Next().ToString();
        DataContext = dtone;
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        dtone.Title = Rnd.Next().ToString();
    }
}

XAML:

<local:MyUserControl Grid.Row="1" Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" TextModified="{Binding TitleModified, UpdateSourceTrigger=PropertyChanged}"/>

绑定不起作用

用户控制

public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();
        (Content as FrameworkElement).DataContext = this;
    }
    public DataContextOne dtone 
    {
        get { return (DataContextOne)GetValue(dtoneProperty); }
        set { SetValue(dtoneProperty, value); }
    }
    public static readonly DependencyProperty dtoneProperty = DependencyProperty.Register(
            "dtone",
            typeof(DataContextOne),
            typeof(MyUserControl),
            null);
}

主窗口

代码隐藏(注意我绑定了this

public partial class MainWindow : Window
{
    Random Rnd = new Random();
    DataContextOne dtone = new DataContextOne();
    public MainWindow()
    {
        InitializeComponent();
        dtone.Title = Rnd.Next().ToString();
        DataContext = this;
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        dtone.Title = Rnd.Next().ToString();
    }
}

XAML

<local:MyUserControl Grid.Row="1" dtone="{Binding dtone, UpdateSourceTrigger=PropertyChanged}" Margin="0,31,200,169"/>

我不明白缺少什么。对我来说,这只是一个封装第二个版本字符串的自定义类型,这是一回事,那么为什么它不起作用呢?

将自定义类型属性绑定到自定义控件

{Binding dtone}试图绑定到DataContext dtone的属性,即MainWindowMainWindow类中没有dtone属性,只有一个私有字段,并且不能绑定到字段。

可能的解决方案:

  • 使dtone成为属性
  • 或将DataContext = this更改为DataContext = dtone{Binding dtone}更改为{Binding}

更新

可能无关,但似乎没有理由在MyUserControl拥有dtone财产。为什么不简单

<local:MyUserControl Grid.Row="1" DataContext="{Binding dtone}" />

而不尝试在构造函数中手动设置DataContext MyUserControl