0

hiarchialdatabinding を使用して監視可能なコレクションによって設定された WPF TreeView があります。監視可能なコレクションまたはそれを設定するために使用されたデータベースの項目にアクセスする必要があります。ユース ケースの例として、ユーザーがツリービュー アイテムを右クリックしてサブグループを追加する場合があります。子を追加するには、明らかにその親にアクセスする必要があります。助言がありますか?私はとても失われました..

ツリービュー項目自体を編集することはできず、変更がデータベースに反映されません

データベース コード:

[Serializable]
public class LoginGroup
{
    public string Name { get; set; }
    public Guid ID { get; set; }
    public List<Login> LoginItems = new List<Login>();
    public List<LoginGroup> Children { get; set; }
}

public static ObservableCollection<LoginGroup> _GroupCollection = new  ObservableCollection<LoginGroup>();

public ObservableCollection<LoginGroup> GroupCollection
{
    get { return _GroupCollection; }
}

ツリー表示:

<TreeView x:Name="groupView" Width="211" TreeViewItem.Selected="OnTreeItemSelected" DockPanel.Dock="Left" Height="Auto" ItemsSource="{Binding GroupCollection}" >
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
4

3 に答える 3

0

プロパティが編集されたことを「通知」する方法がないため、プロパティの変更を反映することはできません。継承または実装する必要がありLoginGroupますDependencyObjectINotifyPropertyChanged

于 2012-05-22T07:44:53.363 に答える
0

SelectedItemにキャストするだけですLoginGroup

LoginGroup selectedGroup = (LoginGroup)groupView.SelectedItem;
于 2012-05-22T07:35:11.130 に答える
0

TreeView の ItemContainer スタイルを使用する必要があります。
サンプルの TreeNode ビュー モデルを次に示します。

public class TreeNode : ViewModel
{
    public TreeNode()
    {
        this.children = new ObservableCollection<TreeNode>();

        // the magic goes here
        this.addChildCommand = new RelayCommand(obj => AddNewChild());
    }

    private void AddNewChild()
    {
        // create new child instance
        var child = new TreeNode 
        { 
            Name = "This is a new child node.",
            IsSelected = true // new child should be selected
        };

        // add it to collection
        children.Add(child);

        // expand this node, we want to look at the new child node
        IsExpanded = true;
    }

    public String Name
    {
        get { return name; }
        set
        {
            if (name != value)
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }
    }
    private String name;

    public Boolean IsSelected
    {
        get { return isSelected; }
        set
        {
            if (isSelected != value)
            {
                isSelected = value;
                OnPropertyChanged("IsSelected");
            }
        }
    }
    private Boolean isSelected;

    public Boolean IsExpanded
    {
        get { return isExpanded; }
        set
        {
            if (isExpanded != value)
            {
                isExpanded = value;
                OnPropertyChanged("IsExpanded");
            }
        }
    }
    private Boolean isExpanded;

    public ObservableCollection<TreeNode> Children
    {
        get { return children; } 
    }
    private ObservableCollection<TreeNode> children;

    public ICommand AddChildCommand
    {
        get { return addChildCommand; }
    }
    private RelayCommand addChildCommand;
}

いくつかのコメント:

  • ViewModel は、INotifyPropertyChanged インターフェイスの基本実装です。
  • RelayCommand (別名 DelegateCommand) は、MVVM アプローチで使用するための ICommand 実装です。

ビューは次のとおりです。

<Window x:Class="WpfApplication1.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">
    <TreeView ItemsSource="{Binding}">
        <TreeView.ItemContainerStyle>
            <!-- Let's glue our view models with the view! -->
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu>
                            <!-- Here's menu item, which is responsible for adding new child node -->
                            <MenuItem Header="Add child..." Command="{Binding AddChildCommand}" />
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.ItemContainerStyle>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Name}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
</Window>

... およびサンプル データ コンテキストの初期化:

    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ObservableCollection<TreeNode>
        {
            new TreeNode { Name = "Root", IsSelected = true }
        };
    }

お役に立てれば。

更新
もちろん、子ノードも ObservableCollection として公開する必要があります。そうしないと、ノード コレクションに加えられた変更が反映されません。

于 2012-05-22T07:39:51.033 に答える