簡體   English   中英

如何綁定到WPF TreeView?

[英]How to make binding to WPF TreeView?

我有一個帶有Binding的TreeView,但在TreeView中只顯示了第一級項目。 我需要樹視圖=)我弄錯了什么是錯的。

這是我的代碼:

MainWindow.xaml

<TreeView Margin="2.996,10,214,10" ItemsSource="{Binding Path=Urls}" Grid.Column="1">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate>
                <Grid>
                    <Rectangle Fill="{Binding Path=Color}" HorizontalAlignment="Left" Stroke="Black" VerticalAlignment="Top" Height="20" Width="20"/>
                    <TextBlock Text="{Binding Path=AbsoluteUrl}" Margin="25,0,0,0" />
                </Grid>
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=AbsoluteUrl}" />
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
</TreeView>

MainViewModel.cs (部分)

public ObservableCollection<Url> Urls { get; set; }

    public MainWindowViewModel()
    {
        Urls = new ObservableCollection<Url>();
    }

Url.cs

class Url : INotifyPropertyChanged
{
    public Url() { }

    public Url(string absoluteUrl, bool isBroken, string color)
    {
        AbsoluteUrl = absoluteUrl;
        IsBroken = isBroken;
        Color = color;
    }

    enum Status { Working, Broken };

    private ObservableCollection<Url> childUrlsValue = new ObservableCollection<Url>();
    public ObservableCollection<Url> ChildUrls
    {
        get
        {
            return childUrlsValue;
        }
        set
        {
            childUrlsValue = value;
        }
    }

    private string _absoluteUrl;
    public string AbsoluteUrl
    {
        get { return _absoluteUrl; }
        set
        {
            if (_absoluteUrl != value)
            {
                _absoluteUrl = value;
                OnPropertyChanged("AbsoluteUrl");
            }
        }
    }

    private bool _isBroken;
    public bool IsBroken
    {
        get { return _isBroken; }
        set
        {
            if (_isBroken != value)
            {
                _isBroken = value;
                OnPropertyChanged("IsBroken");
            }
        }
    }

    private string _color;
    public string Color
    {
        get { return _color; }
        set
        {
            if (_color != value)
            {
                _color = value;
                OnPropertyChanged("Color");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        { 
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

就這個我正在向Urls添加項目:

Url DataGridTopic = new Url(startUrl.ToString(), true, "red");
                    DataGridTopic.ChildUrls.Add(
                        new Url(startUrl.ToString(), true, "red"));
                    DataGridTopic.ChildUrls.Add(
                        new Url(startUrl.ToString(), true, "red"));
                    DataGridTopic.ChildUrls.Add(
                        new Url(startUrl.ToString(), true, "red"));
                    Urls.Add(DataGridTopic);

您必須通過使用其ItemsSource屬性告訴HierarchicalDataTemplate從哪里獲取節點的子項。

在你的情況下:

<HierarchicalDataTemplate
     DataType="{x:Type my:Url}"
     ItemsSource="{Binding Path=ChildUrls}"
>
         ...
</HierarchicalDataTemplate>

還要注意DataType屬性的用法,如果樹的級別由不同的對象類型組成,則通常將成為必需(目錄樹和文件樹就是這樣的例子)。 但是,我不確定這是否適用於您的方案。

暫無
暫無

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

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