Выбрать дочернюю ноду TreeView wpf mvvm

655
26 ноября 2016, 20:36

Доброго времени суток. Нашел массу информации по интересующей проблеме, но ни один пример не удалось применить на своем проекте. Загвоздка в том, что в TreeView вложены разные по типу данные и как их выбрать не могу понять. Вот Model

    public class Algorithms
{
    public AlgorithmsType TypeName { get; set; }
    public List<Algorithm> Algorithm { get; set; }
}
public class Algorithm
{
    public string Name { get; set; }
    public string Text { get; set; }
}

Далее ViewModel

    public class AlgorithmsViewModel : ViewModelBase
{
    private Algorithm _selectedAlgorithm;
    public Algorithm SelectedAlgorithm
    {
        get { return _selectedAlgorithm; }
        set
        {
            _selectedAlgorithm = value;
            RaisePropertyChanged();
        }
    }
    public List<Algorithms> AlgorithmList { get; set; }
    public AlgorithmsViewModel()
    {
    }
}

} И View

<Window.Background>
    <RadialGradientBrush>
        <GradientStop Color="#FF7831AA" Offset="1"/>
        <GradientStop Color="#FFDDB7F7" Offset="0.009"/>
    </RadialGradientBrush>
</Window.Background>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="106*"/>
        <ColumnDefinition Width="181*"/>
    </Grid.ColumnDefinitions>
    <StackPanel CanVerticallyScroll="True" Grid.Column="1" Margin="0,0,0,10">
        <Border BorderThickness="5" BorderBrush="#FFF9F8F7" Margin="10,10,10,10" Height="242">
            <TextBox Text="{Binding SelectedAlgorithms}" IsReadOnly="True" TextWrapping="Wrap" Margin="5"/>
        </Border>
    </StackPanel>
    <Button x:Name="btnGo" Content="Перейти" HorizontalAlignment="Left" Margin="274,257,0,0" VerticalAlignment="Top" Width="75" Grid.Column="1" Height="22"/>
    <TreeView x:Name="tvAlgorithms" ItemsSource="{Binding AlgorithmList}" Grid.Column="0" HorizontalAlignment="Left" Height="269" VerticalAlignment="Top" Width="198" Margin="10,10,0,0">
        <TreeView.Resources>
            <HierarchicalDataTemplate ItemsSource="{Binding Algorithm}" DataType="{x:Type models:Algorithms}">
                <Label>
                    <Label.Style>
                        <Style>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding TypeName}" Value="Symmetrical">
                                    <Setter Property="Label.Content" Value="Симетрические"/>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding TypeName}" Value="Asymmetric">
                                    <Setter Property="Label.Content" Value="Асиметрические"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Label.Style>
                </Label>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type models:Algorithm}">
                <Label Content="{Binding Name}"/>
            </DataTemplate>
        </TreeView.Resources>
    </TreeView>
</Grid>

Так вот, каким образом мне заполучить заветный объект Algorithm, чтобы дальше с ним работать?

Answer 1

SelectedItem в TreeView нет, но можно добиться желаемого результата, например так:

Подписываемся на обработчик события SelectedItemChanged в TreeView:

<TreeView SelectedItemChanged="TreeView_SelectedItemChanged">

дальше в обработчике проверяем, если выделенный элемент имеет тип Algorithm, присваиваем его SelectedAlgorithm.

private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    var vm = this.DataContext as AlgorithmsViewModel;
    if (vm != null)
    {                
       vm.SelectedAlgorithm = e.NewValue as Algorithm;                
    }   
}
READ ALSO
Как добавить в TreeView картинку?

Как добавить в TreeView картинку?

В этом примере в зависимости от object value - название пункта дерева (типа string) определяется картинка в дереве

839
Запуск приложения WPF с параметрами

Запуск приложения WPF с параметрами

Имеется приложение WPF, из которого нужно запустить другое небольшое приложение WPF в виде исполнимого файла (exe) с параметрами, передаваемыми...

805
Как правильно сделать таймер в service на xamarin android?

Как правильно сделать таймер в service на xamarin android?

Приложение запускает Service по нажатию на кнопку, в котором начинает тикать таймер

585