我想在WPF TreeView中进行绑定

时间:2014-06-12 17:34:38

标签: c# wpf binding treeview

我正在尝试控制添加具有TreeView的联系人。当我向控件添加联系人时,在treeView中显示任何内容。在这里,我展示了代码:

<TreeView x:Name="TvContactos" ItemsSource="{Binding Path=Groups}" HorizontalContentAlignment="Stretch" DockPanel.Dock="Left"  ScrollViewer.CanContentScroll="True"> 
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type local:ViewModelGroupContact}" ItemsSource="{Binding Children}">
                    <Grid Height="35">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding GroupName}" Style="{StaticResource BloStyle}" Grid.Column="0"/>
                    </Grid>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type local:ViewModelContact}">
                <Grid Height="38">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"></ColumnDefinition>
                        <ColumnDefinition Width="*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <Image Height="32" Width="32" Source="Resources/User.jpg" Margin="3" Grid.Column="0"/>
                    <TextBlock Text="{Binding ContactName}" Style="{StaticResource BloStyle}" Grid.Column="1"/>
                </Grid>
            </DataTemplate> 
        </TreeView.Resources>
            <TreeView.DataContext>
                <local:ViewModelGroups/>
            </TreeView.DataContext>
        </TreeView.Resources>

在后面的代码中,我有以下类

public class ViewModelGroups : INotifyPropertyChanged
{

    ObservableCollection<ViewModelGroupContact> _groups;

    public ViewModelGroups()
    {
        Groups = new ObservableCollection<ViewModelGroupContact>();
    }

    public ObservableCollection<ViewModelGroupContact> Groups
    {
        get { return _groups; }
        set
        {
            _groups = value;
            OnPropertyChanged("Groups");
        }
    }

    public void AddGroup(string groupName,RosterItem contact)
    {
        var newContact = new Contact {Name = contact.Name ?? contact.Jid.ToString(), RosterItem = contact};
        var vmc = _groups.FirstOrDefault(item => item.GroupName == groupName);
        if (vmc == null)
        {
            var contGroup = new ContactGroup { Name = groupName };
            vmc = new ViewModelGroupContact(contGroup);
        }
        vmc.AddContactToGroup(newContact);
        Dispatcher.CurrentDispatcher.BeginInvoke((new Action(() => Groups.Add(vmc))));
        OnPropertyChanged("Groups");
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class ViewModelGroupContact : TreeViewItemViewModel

{
    private readonly ContactGroup _contactGroup;

    public string GroupName { get; set; }

    public ViewModelGroupContact(ContactGroup contactGroup)
        : base(null, true)
    {
        _contactGroup = contactGroup;
        GroupName = _contactGroup.Name;
    }

    protected override void LoadChildren()
    {
        foreach (Contact contact in _contactGroup.GetContacts())
            base.Children.Add(new ViewModelContact(contact, this));
    }

    public void AddContactToGroup(Contact contact)
    {
        if (!_contactGroup.GetContacts().Contains(contact))
            _contactGroup.AddContactToGroup(contact);
    }
}

public class ViewModelContact:TreeViewItemViewModel
{
    private readonly Contact _contact;

    public ViewModelContact(Contact contact, ViewModelGroupContact group)
        : base(group, true)
    {
        _contact = contact;
    }

    public string ContactName
    {
        get { return _contact.Name; }
    }
}

当向树视图添加联系人时,不会显示任何内容。没有显示继承自INotifyPropertyChanged的TreeViewItemViewModel类,因为该帖子没有做更长的时间。这个类有一个名为Childrens的属性。

这是缺少的控件类

public partial class ContactControl : UserControl
{
    #region Private

    private ViewModelGroups _viewModel;

    private const string MDefaultGroupName = "ungrouped";

    #endregion
    public ContactControl()
    {
        InitializeComponent();
        Init();
    }

    public ViewModelGroups ViewModel
    {
        get { return _viewModel; }
    }

    public void Init()
    {
        _viewModel = new ViewModelGroups();
        TvContactos.DataContext = _viewModel;
    }

    public void AddContact(RosterItem ritem)
    {
        string groupname;
        if (ritem.GetGroups().Count > 0)
        {
            var g = (Group)ritem.GetGroups().Item(0);
            groupname = g.Name;
        }
        else
        {
            groupname = MDefaultGroupName;
        }
        _viewModel.AddGroup(groupname, ritem);
    }
}

0 个答案:

没有答案