如何将一个字段与用户控件绑定

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

    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}" />

在加载中,窗口包含以下内容:

    public List<Problem> list;

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

但在XAML代码中,绑定它并不起作用。无法传递数据。我错在哪里了?

1个回答

1

在 WPF 中,您无法将绑定到字段,而必须将 list 更改为属性。

您在您的 UserControl 中调用 Dependency Property FooList ,并在 Xaml 中调用 ResultList ,但我猜这是问题中的打字错误。

您应该在 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
}

非常感谢你,Meleak,它正常工作了。实际上,这是我问过你的同一个问题。我非常感激你的帮助。 - oscar.fimbres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接