Какой самый безопасный способ привязки данных к элементу в другом файле xaml в WPF - PullRequest
0 голосов
/ 25 мая 2010

У меня есть приложение, которое показывает дерево, где можно выбрать узлы дерева и добавить их в список. Чтобы сохранить код в чистоте, я переместил TreeView в его собственный UserControl (я использую это дерево в нескольких местах) и файл xaml. Чтобы добавить узел в список, у меня есть кнопка «Добавить». Однако я хочу выделить эту кнопку «Добавить» серым цветом, когда ни один из элементов дерева не выбран. Какой самый мудрый способ сделать это? Я могу привязаться к полному пользовательскому контролю и написать более сложный конвертер, но это кажется не элегантным. Есть ли простые решения?

Я бы надеялся, что что-то вроде "ElementName = xamlFile.TargetElement" сработает ...

Ответы [ 2 ]

1 голос
/ 03 июня 2010

Команды обеспечивают автоматическое отключение кнопок, использующих их, когда команда не может быть выполнена. Если вы создаете команду и добавляете обработчики для нее в свой UserControl, внешняя кнопка Add может использовать команду.

<local:TreeViewControl x:Name="Tree"/>
<Button Content="Add" Command="{x:Static local:TreeViewControl.AddCommand}" CommandTarget="{Binding ElementName=Tree}"/>

Создание команды и подключение:

public partial class TreeViewControl : UserControl
{
    public static RoutedCommand AddCommand { get; private set; }

    static TreeViewControl()
    {
        AddCommand = new RoutedCommand("AddCommand", typeof(TreeViewControl));
    }

    public TreeViewControl()
    {
        InitializeComponent();

        CommandBindings.Add(new CommandBinding(AddCommand, AddExecuted, AddCanExecute));
    }

    public void AddExecuted(object sender, ExecutedRoutedEventArgs e)
    {
    }

    public void AddCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = false; // your logic here
    }
}

Если вы используете MVVM, вы можете использовать DelegateCommand или RelayCommand, чтобы делать похожие вещи из ViewModel.

0 голосов
/ 25 мая 2010

Вот как бы я это сделал. Я хотел бы иметь Main.Xaml, который будет иметь Main_ViewModel.Xaml, установленный как его DataContext. В Main.Xaml у меня был бы MyTreeViewControl и кнопка. Для MyTreeViewControl я бы также создал MyTreeViewControl_ViewModel (который будет использовать INotifyPropertyChanged). В Main_VeiwModel я хотел бы создать свойство MyTreeViewControl_ViewModel и создать его экземпляр с новым экземпляром MyTreeViewControl_ViewModel. Затем в Main.xaml вы можете установить DataContext вашего MyTreeViewControl в качестве этого свойства. В Main_ViewModel у вас может быть свойство Visibility, с которым связана видимость кнопок «Добавить». В Main_ViewModel вы можете подписаться на событие PropertyChanged MyTreeViewControl_ViewModel. В этом случае вы можете проверить, изменился ли ваш «SelectedItem», если это так, вы можете переоценить и установить свойство Visibility для кнопки добавления.

Извините, у меня не было времени привести пример кода. Я мог бы кое-что исправить для тебя позже, если тебе это действительно нужно. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...