绑定到依赖项集合的项

时间:2018-07-09 19:47:09

标签: xaml binding custom-controls

我正在尝试创建一个具有页眉,页脚和正文的自定义控件。这个想法是报告的主体是一个自定义的堆栈面板控件,该控件将允许用户指示页面方向和分组。我在自定义UC上创建了一个依赖项属性,以接受自定义堆栈面板的IList。我想做的是绑定到列表中的堆栈面板之一。但是由于某种原因,绑定无法正常工作。

报告页面:

public class ReportPage : StackPanel
{
    //Nothing right now but will eventually include controls for page orientation and size (8.5x11, 11x17, etc.)
}

后面的UserControl代码:

public partial class Report : UserControl, INotifyPropertyChanged
{
    public Report()
    {
        ReportPages = new List<ReportPage>();
    }

    public static readonly DependencyProperty =
        DependencyProperty.Register("ReportPages", typeof(IList), typeof(Report));

    public IList ReportPages
    {
        get => (IList)GetValue(ReportPagesProperty);
        set
        {
            SetValue(ReportPagesProperty, value);
            ActivePage = value[0];
            OnPropertyChanged(nameof(ActivePage));
        }
    }

    private ReportPage _activePage;
    public ReportPage ActivePage
    {
         get => _activePage;
         set
         {
             _activePage = value;
             OnPropertyChanged(nameof(ActivePage));
         }
    {
}

UserControl xaml:

<Grid>
    <!--Some xaml for the header and footer.-->
    <ContentControl Content="{Binding ActivePage, RelativeSource={RelativeSource, FindAncestor, AncestorType=local:Report}}"/>
</Grid>

这是我使用自定义控件的方式。至少在我看来,这应该制作三个“页面”,我可以在使用不共享的按钮控件之间进行切换。

<reportEngine:Report>
    <reportEngine:Report.ReportPages>

        <reportEngine:ReportPage>
            <TextBlock>This is Page 1</TextBlock>
        </reportEngine:ReportPage>

        <reportEngine:ReportPage>
            <TextBlock>This is Page 2</TextBlock>
        </reportEngine:ReportPage>

        <reportEngine:ReportPage>
            <TextBlock>This is Page 3</TextBlock>
        </reportEngine:ReportPage>

    </reportEngine:Report.ReportPages>
</reportEngine:Report>

任何想法为什么绑定无效?

1 个答案:

答案 0 :(得分:0)

所以我至少找到了一个快速的解决方法。我使用了this答案中的Collection Changed Event处理程序模式,并将其修改为静态依赖项属性。然后,要从绑定到依赖项属性的集合中获取值,我在构造函数中创建Report对象的静态实例,并使用该实例将各种值传递给集合中的对象。像这样:

public partial class Report : UserControl, INotifyPropertyChanged
{
    private static Report _thisReport;

    public Report()
    {
        InitializeComponent();
        ReportPages = new ObservableCollection<ReportPage>();
        _thisReport = this;
    }

    public static readonly DependencyProperty ReportPagesProperty =
        DependencyProperty.Register("ReportPages", typeof(IList), typeof(Report), new FrameworkPropertyMetadata(ReportPagesChanged));

    public IList ReportPages
    {
        get => (IList)GetValue(ReportPagesProperty);
        set
        {
            SetValue(ReportPagesProperty, value);
            //Update some other properties associated with the control (Total Page Numbers, etc.)
        }
    }

    private static void ReportPagesChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
    {
        var newColl = (INotifyCollectionChanged)eventArgs.NewValue;
        if (newColl != null)
            newColl.CollectionChanged += ReportPages_CollectionChanged;

        var oldColl = (INotifyCollectionChanged)eventArgs.OldValue;
        if (oldColl != null)
            oldColl.CollectionChanged -= ReportPages_CollectionChanged;
    }

    private static void ReportPages_CollectionChanged(object sender, NotifyCollectionChangedEventArgs eventArgs)
    {
        var newPages = (IList<ReportPage>) sender;

        //Updates properties of the Report control.
        _thisReport.ActivePage = newPages[0];
        _thisReport.TotalPageNumber = newPages.Count;

    }
}

这是否是“正确的”,我不能说,但这是可行的。如果有人有更好的答案,我会更改答案。