0

TreeView から選択したアイテムを取得しようとしていますが、問題があります。

私はMVVMアーキテクチャに従っています。私のViewModelには、私のモデルにあるクラスのコレクションが含まれています。そのため、TreeView の ItemSource をそのコレクションにバインドしました。TreeView の selectedItem をバインドされたコレクションのアイテムにバインドしたいと考えています。それ、どうやったら出来るの?SelectedItem と IsSelected プロパティのコードは次のとおりです。

    private static sourceData _selectedItem = null;
    /// <summary>
    /// Selected Item in the tree
    /// </summary>
    public static sourceData SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            if (_selectedItem != value)
            {
                _selectedItem = value;
            }
        }
    }

    private bool _isSelected;
    /// <summary>
    /// Get/Set for Selected node
    /// </summary>
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            if (_isSelected != value)
            {
                _isSelected = value;

                if (_isSelected)
                {
                    SelectedItem = this;
                    OnPropertyChanged("IsSelected");
                }
            }
        }
    }

    /// <summary>
    /// Property changed event
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;
    /// <summary>
    /// Property changed event handler
    /// </summary>
    /// <param name="propertyName"></param>
    protected virtual void OnPropertyChanged(string propertyName)
    {
        var handler = this.PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

これをデバッグすると、int SelectedItem = this;'this' ポインターには、ツリービューがバインドされているコレクションが含まれます。選択した項目に割り当てることができるように、SelectedDataSource が必要でした。TreeView がコレクション内の selectedItem を返すようにするにはどうすればよいですか??

参考までに、これは TreeView の XAML コードです

<TreeView Margin="5,0,0,0" ItemsSource="{Binding SourceData}"  Width="390">
                    <TreeView.ItemContainerStyle>
                        <Style TargetType="{x:Type TreeViewItem}">
                            <Setter Property="IsSelected" Value="{Binding DataContext.IsSelected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
                          <Setter Property="ContextMenu">
                                <Setter.Value>
                                    <ContextMenu Name="contextMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" >
                                        <MenuItem Name="menuItem" Header="Rename" Command="{Binding RenameCommand}" />
                                    </ContextMenu>
                                </Setter.Value>
                            </Setter>
                            <Style.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </TreeView.ItemContainerStyle>

PS: モデルに上記のコードを記述した場合、すべてが完全に正常に動作します。しかし、上記のコードを Model で書くことはできません。VM である必要があります。

4

1 に答える 1