0

у меня на view есть TreeView и ListBox как мне в зависимости от того что выбрано в TreeView изменить данные в ListBox? Нашел у TreeView эвент SelectedItemChanged но не понимаю как его использовать с привязыванием. По факту мне просто нужен вызов функции в котором я напишу нечто вроде

RegValues = SelectedKey.GetContent();

кусочек view.xaml

<TreeView Name="tree" 
              ItemsSource="{Binding TreeViewData}" 
                SelectedValuePath="{Binding SelectedKey}"
              >

        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=ChildGroup}">
                        <TextBlock Text="{Binding name}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

кусочек viewmodel.cs

public List<String> RegValues
    {
        get {
            int i = 0;
            return (List<String>)GetValue(RegValuesProperty); 
        }
        set { SetValue(RegValuesProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty RegValuesProperty =
        DependencyProperty.Register("RegValues", typeof(List<String>), typeof(Level2PageViewModel));

public RegModel SelectedKey
    {
        get { return (RegModel)GetValue(SelectedKeyProperty); }
        set
        {SetValue(SelectedKeyProperty, value);}
    }

    // Using a DependencyProperty as the backing store for SelectedValue.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedKeyProperty =
        DependencyProperty.Register("SelectedKey", typeof(RegModel), typeof(Level2PageViewModel));

public List<RegModel> TreeViewData
        {
            get { return (List<RegModel>)GetValue(TreeViewDataProperty); }
            set { SetValue(TreeViewDataProperty, value); }
        }

        // Using a DependencyProperty as the backing store for TreeViewData.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TreeViewDataProperty =
            DependencyProperty.Register("TreeViewData", typeof(List<RegModel>), typeof(Level2PageViewModel));
  • 1
    для привязки следует использовать не события, а свойства - в вашем случае создайте еще одно свойство во вьюмодел и привяжете его к SelectedItem у TreeView – Bulson Jan 22 '17 at 19:09
  • 1
    Да, и кто вас учил использовать во вьюмодел DependencyProperty? Это дичь, если честно. Используйте обычные свойства с реализацией INotifyPropertyChanged. DependencyProperty` годны лишь для кодбихайнд, но не для вьюмодел. – Bulson Jan 22 '17 at 19:12
  • @Bulson спасибо. меня никто не учил, увидел использование DependencyProperty во вьюмодели в каком то видео на ютубе. если у вас есть какой нибудь хороший источник на тему того где и что использовать буду очень признателен. – Dark32167 Jan 22 '17 at 22:20
  • 1
    Расскажите лучше, что именно вы хотите показывать. Расскажите о вашей задаче на более высоком уровне. Так будет понятнее, как вашу задачу правильно решать. – VladD Jan 22 '17 at 22:25
  • @VladD Мне необходимо выводить реестр windows соответственно окно выглядит примерно так же как regedit слева treeview справа датагрид. Есть класс который содержит в себе ключреестра, его подкаталоги и его наполнение реализованное другим классом.

    следовательно по клику на строчку treeview я хочу чтобы изменялся контент в датагриде.

    – Dark32167 Jan 22 '17 at 22:54

1 Answers1

1

На самом деле всё просто.

Заводите свойство типа ObservableCollection<RegistryValue>, пускай называется Values. В начале оно содержит пустую коллекцию.

У вас в VM есть свойство SelectedKey. Вы на его изменении должны сделать новое заполнение Values, значениями из текущего ключа. К Values вы привязываете вашу правую панель, DataGrid или просто ListView.

Теперь, как подписаться на изменение SelectedKey? Это легче сделать, если ваши свойства определены через INotifyPropertyChanged, там вы можете просто вызвать нужную функцию из сеттера.

private RegModel selectedKey
public RegModel SelectedKey
{
    get { return selectedKey; }
    set { if (Set(ref selectedKey, value)) UpdateValues(); }
}

(функцию Set можно посмотреть тут).

Если вы таки хотите пользоваться DependencyProperty в VM (там им по идее не место, им место во View), пишите так:

public RegModel SelectedKey
{
    get { return (RegModel)GetValue(SelectedKeyProperty); }
    set { SetValue(SelectedKeyProperty, value); }
}
public static readonly DependencyProperty SelectedKeyProperty =
    DependencyProperty.Register(
        "SelectedKey", typeof(RegModel), typeof(Level2PageViewModel),
         new FrameworkPropertyMetadata((o, args) =>
                 {
                     var self = (Level2PageViewModel)o;
                     self.UpdateValues();
                 }));

Вроде бы всё.


P. S.: Ваше свойство RegValues — это наверное то, что я имел в виду под Values.

VladD
  • 206,799
  • спасибо. но почему место DependencyProperty во вью? я думал что в коде вью ничего не должно быть в принципе Оо – Dark32167 Jan 24 '17 at 15:01
  • 1
    @Dark32167: Ну, смотрите, вот у вас есть контрол, например, StackPanel. Он же тоже во View, правильно? И у него есть куча DependencyProperty. Если вы создаёте свой контрол, то вам нужны какие-то свойства, вы не можете создать новый тип контрола вовсе без code-behind. Вот их имеет смысл оформлять как DependencyProperty. – VladD Jan 24 '17 at 15:11