Контекстное меню WPF Treeview IsChecked привязка MVVM - PullRequest
0 голосов
/ 27 марта 2010

У меня есть TreeView, с которым я связываю ContextMenu. В этом контекстном меню есть элемент, свойство IsChecked которого я хочу привязать к моей ViewModel. Поскольку я использую дерево, каждый элемент дерева привязан к подвойству моей ViewModel.

В окне вывода VS2010 я вижу эту ошибку привязки данных:

Ошибка пути BindingExpression: свойство «IsAutoStart» не найдено в «объекте», «HostMgmtViewModel» (HashCode = 12565727) '. BindingExpression: Path = IsAutoStart; DataItem = 'HostMgmtViewModel'

Это ясно показывает, что он пытается привязаться к моей ViewModel, а не к связанным данным древовидного элемента. Как мне привязать к нужному объекту? Помните, что мое контекстное меню связано со всем TreeView, а не с конкретным элементом дерева.

---------- Редактировать

Как указал xandy ниже, моей проблемой было связать IsChecked следующим образом:

{Binding Path=PlacementTarget.SelectedItem.IsDisabledStart, Mode=OneWay, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}

1 Ответ

3 голосов
/ 27 марта 2010
    <TreeView Name="tview" Grid.Row="0" Tag="{Binding RelativeSource={RelativeSource Self}, Path=SelectedItem}">
        <TreeView.ContextMenu>
            <ContextMenu>
                <MenuItem Name="miC" Header="{Binding Path=Tag.Key}" DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"></MenuItem>
            </ContextMenu>
        </TreeView.ContextMenu>
    </TreeView>

Это фрагмент рабочего кода, который у меня есть. Предоставлено [this]. 1 Все, что вам нужно, это изменить путь привязки в теге. В настоящее время я привязываю Treeview к словарю, так что это его свойство Key. У него не должно быть проблем с привязкой к каким-либо коллекциям объектов. Один интересный вывод заключается в том, что контекстное меню не является частью дерева элементов, и это вызывает проблему. Я мог бы связать текстовое поле без проблем:

    <TextBlock Grid.Row="1" DataContext="{Binding ElementName=tview, Path=SelectedItem}">
        <TextBlock.Text>
            <Binding Path="Key" />
        </TextBlock.Text>
    </TextBlock>

Но он не работает, если по меню, если я поставил то же самое.

...