簡體   English   中英

無法綁定到ListBox的ListBox子級

[英]Cannot bind to ListBox child of ListBox

我綁定到一個列表框,並在列表框內,另一個列表框。

我的模特看起來像

public interface ICriteriaDetail
{
    string Title { get; }
    int NumberOfEvents { get; }
    ICriteriaDetail ChildCriteria { get; }
}

因此,我正在為孩子使用遞歸方法(而不是列表)。

當我綁定到ListView時,我將這些項放在一個列表中,一個在另一個下。

問題是,子項根本沒有顯示!

虛擬數據

  public static IEnumerable<ICriteriaDetail> GetCriteriaList()
    {
        var list = new List<CompoundCriteria.Ui.Model.Interfaces.ICriteriaDetail>();
        list.Add(GetCriteriaDetail("My Title", 5, false));
        list.Add(GetCriteriaDetail("Other", 3, false));
        list.Add(GetCriteriaDetail("Biggy", 8, true));

        var child = new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail("childAgain", 43, null);
        var child2 = new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail("childAgainAgain", 13, child);

        list.Add(new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail("Really big", 86, new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail("smaller", 15, child2)));

        return list;
    }

    private static ICriteriaDetail GetCriteriaDetail(string title, int events, bool hasChild)
    {
        if (!hasChild)
            return new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail(title, events, null);

        var child = new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail("child" + title, 13 + events, null);
        return new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail(title, events, child);
    }

ViewModel

    public MainWindowViewModel()
    {
        this.Criterias = DatasourceMockup.GetCriteriaList();
    }

    private IEnumerable<ICriteriaDetail> _criterias;
    public IEnumerable<ICriteriaDetail> Criterias
    {
        get { return _criterias; }
        set { _criterias = value; }
    }

還有XAML中的ListBox

 <ListBox ItemsSource="{Binding Criterias}" >
                    <ListBox.Resources>
                         <ControlTemplate x:Key="con">
                            <StackPanel Orientation="Horizontal">
                            <StackPanel Margin="15">
                                <TextBlock Text="{Binding Title}" />
                                <TextBlock Text="Events: ">
                                <Run Text="{Binding NumberOfEvents}" />
                                </TextBlock>
                             </StackPanel>
                             <ListBox ItemsSource="{Binding ChildCriteria} Visibility="{Binding ChildCriteria, Converter={StaticResource HideIfNull}}">">
                                    <ListBox.Resources>
                                        <DataTemplate DataType="{x:Type cDetail:CriteriaDetail}">
                                                <TextBlock Text="{Binding Title}" />
                                        </DataTemplate>
                                    </ListBox.Resources>
                                </ListBox>
                            </StackPanel>
                        </ControlTemplate>

                        <HierarchicalDataTemplate DataType="{x:Type cDetail:CriteriaDetail}">
                                <Control Template="{StaticResource con}" />
                        </HierarchicalDataTemplate>
                    </ListBox.Resources>
                </ListBox>

閱讀TreeView,HierarchicalDataTemplate和遞歸數據后 ,似乎HierarchicalDataTemplate就足夠了(也不需要DataTemplate),但是我迷失了為什么我看不到預期的結果(即使孩子不在理想的地方,我還是希望看到他們)

編輯

我剛剛添加了一個轉換器,如果綁定數據為null,則該轉換器會使ListBox(ControlTemplate內部的一個)隱藏。 我只有3個中的1個(正確)的輪廓(一個空的ListBox),但是它沒有綁定任何內容(標題)。 輸出窗口顯示沒有任何用處...

請注意,兒童沒有限制。 在上面的示例中,有一個父子關系,但也可能是parent-child-child-child等

1)很難理解您的目的,如果您的模型中有ChildCriteria ,而不是IEnumerable<ICriteriaDetail> ,為什么要使用ListBox?

2)你也有綁定錯誤,我改變了XAML

<ListBox ItemsSource="{Binding Criterias}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <StackPanel Margin="15">
                            <TextBlock Text="{Binding Title}" />
                            <TextBlock Text="Events: ">
                                <Run Text="{Binding NumberOfEvents}" />
                            </TextBlock>
                </StackPanel>
                <TextBox Text="{Binding Path=DataContext.ChildCriteria.Title, 
                                        RelativeSource={RelativeSource Mode=FindAncestor, 
                                                        AncestorType={x:Type ListBoxItem}, 
                                                        AncestorLevel=1}}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

並得到

我的結果

EDIT1:1)我將數據模型更改為

public class CriteriaDetail : ICriteriaDetail
{
    public CriteriaDetail(string title, int numberOfEvents, IEnumerable<ICriteriaDetail> childCriteria)
    {
        Title = title;
        NumberOfEvents = numberOfEvents;
        ChildCriteria = childCriteria;
    }

    public string Title { get; set; }
    public int NumberOfEvents { get; set; }
    public IEnumerable<ICriteriaDetail> ChildCriteria { get; set; }
}

2)將xaml更改為

<TreeView ItemsSource="{Binding Criterias}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding ChildCriteria}">
                <TextBlock Foreground="Red" Text="{Binding Title}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
</TreeView>

3)將GetCriteriaDetail更改為

    private static ICriteriaDetail GetCriteriaDetail(string title, int events, bool hasChild)
    {
        if (!hasChild)
            return new CriteriaDetail(title, events, null);

        var child3 = new CriteriaDetail("child3" + title, 13 + events, null);
        var child2 = new CriteriaDetail("child2" + title, 13 + events, new ICriteriaDetail[] { child3 });
        var child1 = new CriteriaDetail("child1" + title, 13 + events, new ICriteriaDetail[] { child2 });


        return new CriteriaDetail(title, events, new ICriteriaDetail[] {child1});
    }

知道了 我覺得它看起來更像你想要的 結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM