Skip to main content
 首页 » 编程设计

c#之如何绑定(bind)到集合集合下的对象的属性

2024年02月13日33sharpest

我有一个包含名称属性的类 (TopLevel) 的 ObservableCollection 和一个只有名称属性的类 (BottomLevel) 的另一个 ObservableCollection 的列表。最高列表上的绑定(bind)有效,但是当我尝试绑定(bind)到 BottomList 上的属性时,我什么也得不到。我在这里缺少什么?

XAML:

<Window x:Class="WpfApplication7.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid x:Name="myGrid" DataContext="topList"> 
    <Border BorderBrush="AliceBlue" Grid.Column="0" BorderThickness="5"> 
        <ItemsControl x:Name="ic1"> 
            <ItemsControl.ItemTemplate> 
                <DataTemplate> 
                    <StackPanel> 
                        <Label Content="{Binding Path=TopName}"/> 
                        <Border BorderBrush="AntiqueWhite" Grid.Column="1" BorderThickness="5"> 
                            <Button Content="{Binding Path=BottomList.BottomName}"/> 
                        </Border> 
                    </StackPanel> 
                </DataTemplate> 
            </ItemsControl.ItemTemplate>                 
        </ItemsControl>             
    </Border> 
</Grid> 

代码隐藏:

public partial class MainWindow : Window 
{ 
    public ObservableCollection<TopLevel> topList; 
    public MainWindow() 
    { 
        InitializeComponent(); 
        topList = new ObservableCollection<TopLevel>(); 
        topList.Add(new TopLevel("T" + (1 + topList.Count).ToString())); 
        topList[0].AddBottom(); 
        topList.Add(new TopLevel("T" + (1 + topList.Count).ToString())); 
        topList[1].AddBottom(); 
        ic1.ItemsSource = topList;             
    } 
} 
 
public class TopLevel 
{ 
    private ObservableCollection<BottomLevel> bottomList; 
    private string topName; 
 
    public void AddBottom() 
    { 
        bottomList.Add(new BottomLevel("B" + (1 + bottomList.Count).ToString())); 
    } 
 
    public TopLevel(string x) 
    { 
        bottomList = new ObservableCollection<BottomLevel>(); 
        topName = x; 
    } 
 
    public string TopName 
    { 
        get 
        { 
            return topName; 
        } 
        set 
        { 
            if (topName!=value) 
            { 
                topName = value; 
            } 
        } 
    } 
 
    public ObservableCollection<BottomLevel> BottomList 
    { 
        get 
        { 
            return bottomList; 
        } 
        set 
        { 
            if (bottomList!=value) 
            { 
                bottomList = value; 
            } 
        } 
    } 
} 
 
public class BottomLevel 
{ 
    private string bottomName; 
 
    public BottomLevel(string x) 
    { 
        bottomName = x; 
    } 
 
    public string BottomName 
    { 
        get 
        { 
            return bottomName; 
        } 
        set 
        { 
            if (bottomName!=value) 
            { 
                bottomName = value; 
            } 
        } 
    } 
} 

请您参考如下方法:

您的按钮路径不正确。 BottomList 没有“名称”属性,因此您无法绑定(bind)到它。相反,只需使用 BottomName 作为您的路径。

因为您的 topList 有一个“BottomLevel”集合,您需要某种嵌套项控件来迭代“bottomList”集合(然后使用“BottomName”作为您的路径,如上所述) .

就目前而言,您基本上拥有:

<ItemsControl //List of TopLevel> 
//Your data context is now the TopLevel item itself 
<Button Path=/> //What goes here? you have a whole collection of BottomLevel items to choose from! 
</ItemsControl>