Как получить текстовое значение выбранного TreeViewItem? - PullRequest
0 голосов
/ 17 декабря 2018

Мой код, который генерирует TreeView из базы данных, работает, но теперь я хочу открыть новое окно на основе выбранного TreeViewItem, но я не уверен, как получить доступ к элементу в моем обработчике событий SelectedItemChanged.

Compiler error in event handler

TreeView Xaml:

<TreeView x:Name="Tree" SelectedItemChanged="Tree_SelectedItemChanged" ItemsSource="{Binding RootNodes}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding rsParentChild}">
            <Grid>
                <materialDesign:PackIcon Kind="{Binding icon}" VerticalAlignment="Center"/>
                <TextBlock  Name="MenuItem" Margin="20,0,0,0" Text="{Binding NodeDescription}"  FontFamily="Humanst521 Lt BT" ></TextBlock>
            </Grid>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Код:

public Dashboard()
{
    InitializeComponent();
    this.DataContext = dbm;
    dbm = (Model.Administration.DashboardModel)FindResource("modVar");

    var dataSet = getData();
    _rootNodes = dataSet.Tables["Table1"].DefaultView;
    _rootNodes.RowFilter = "ParentId IS NULL";
    this.DataContext = this;
}

private DataView _rootNodes;
public DataView RootNodes
{
    get { return _rootNodes; }
}

internal DataSet getData()
{
    DataTable dt = dbm.Menu(dbm, "Menu");
    DataSet ds = new DataSet();
    ds.Tables.Add(dt);

    //add a relationship
    ds.Relations.Add("rsParentChild", ds.Tables["Table1"].Columns["Id"], ds.Tables["Table1"].Columns["ParentId"], false);
    return ds;
} 

private void Tree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<T> e)
{
    string menuitem = MenusItem.text;
    System.Windows.MessageBox.Show("menuitem");
}

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы можете создать привязываемое свойство SelectedItem, используя WPF Behaviors

public class perTreeViewHelper : Behavior<TreeView>
{
    public object BoundSelectedItem
    {
        get => GetValue(BoundSelectedItemProperty);
        set => SetValue(BoundSelectedItemProperty, value);
    }

    public static readonly DependencyProperty BoundSelectedItemProperty =
        DependencyProperty.Register("BoundSelectedItem",
            typeof(object),
            typeof(perTreeViewHelper),
            new FrameworkPropertyMetadata(null,
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                OnBoundSelectedItemChanged));

    private static void OnBoundSelectedItemChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        if (args.NewValue is perTreeViewItemViewModelBase item)
            item.IsSelected = true;
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
        base.OnDetaching();
    }

    private void OnTreeViewSelectedItemChanged(object obj, RoutedPropertyChangedEventArgs<object> args)
    {
        BoundSelectedItem = args.NewValue;
    }
}

Подробнее и более широкое общее обсуждение TreeViews в WPF в моем сообщении в блоге .

0 голосов
/ 18 декабря 2018

Вам нужно использовать свойства события, чтобы получить доступ к выбранному TreeViewItem (или, в вашем случае, DataRowView).Я немного изменил пример из for SelectedItemChanged , чтобы он соответствовал вашему коду.Обратите внимание, что данные события содержат DataRowView, который был выбран.Вам нужно использовать данные события, чтобы получить выбранный элемент, а затем вы можете делать с ним все, что вам нужно.

private void Tree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<Object> e)
{
    var item = (DataRowView) e.NewValue;
    System.Windows.MessageBox.Show(item["Id"].ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...