如何将字段绑定到用户控件

本文关键字:用户 控件 绑定 字段 | 更新日期: 2023-09-27 18:05:42

在我的用户控件中,我有这个属性:

    public static DependencyProperty FooListProperty = DependencyProperty.Register(
        "FooList", typeof(List<Problem>), typeof(ProblemView));
    public List<Problem> FooList
    {
        get
        {
            return (List<Problem>)GetValue(FooListProperty);
        }
        set
        {
            SetValue(FooListProperty, value);
        }
    }
    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        base.OnPropertyChanged(e);
        if (e.Property == FooListProperty)
        {
            // Do something
        }
    }

由于另一个窗口,我试图为最后一个用户控件设置一个值:

    <local:ProblemView HorizontalAlignment="Center"
                       VerticalAlignment="Center" FooList="{Binding list}" />

load中的窗口包含:

    public List<Problem> list;
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // Some processes and it sets to list field
        list = a;
    }

但是在XAML代码中,绑定它不起作用。不要传递数据。我错了吗?

如何将字段绑定到用户控件

你不能在WPF中绑定一个字段,你必须将list更改为属性。

您在Xaml中调用UserControlResultList中的依赖属性FooList,但我猜这是问题中的错字。

你应该在Window中实现INotifyPropertyChanged,让绑定知道值已经更新了。

我不确定你是否在Xaml ProblemView中设置了正确的DataContext,如果你不确定你可以命名Window并在绑定中使用ElementName

<Window Name="window"
        ...>
    <!--...-->
    <local:ProblemView HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       ResultList="{Binding ElementName=window,
                                            Path=List}" />
    <!--...-->
</Window>

示例代码
public partial class MainWindow : Window, INotifyPropertyChanged
{
    //...
    private List<Problem> m_list;
    public List<Problem> List
    {
        get { return m_list; }
        set
        {
            m_list = value;
            OnPropertyChanged("List");
        }
    }
    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion
}