Nano Hash - криптовалюты, майнинг, программирование

Как я могу получить доступ к свойствам/методам DataContext, используемым для заполнения класса XAML из кода программной части?

Я хочу использовать SaveFileDialog в коде для записи файла с использованием данных, содержащихся в ViewModel. Класс XAML, с которым я работаю, заполняется выбором, сделанным в списке в родительском классе:

    <Views:ChildView DataContext="{Binding Path=SelectedItem, ElementName=childrenListbox}"></Views:ChildView >

Затем в файле ChildView XAML я могу свободно обращаться к свойствам/методам ChildViewModel, как и ожидалось. Однако я не знаю, как получить к ним доступ из кода позади. У меня есть кнопка "Сохранить файл"

    <Button Content="Save File" Click="Button_Click"></Button>

чье событие обрабатывается в коде:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
        dlg.FileName = "Document";
        dlg.DefaultExt = ".txt";
        dlg.Filter = "Text documents (.txt)|*.txt";

        Nullable<bool> result = dlg.ShowDialog();

        if (result == true)
        {
            string filename = dlg.FileName;
            //Here I would like to call the SaveFile function in ChildViewModel
        }
    }

Я попытался просмотреть все доступные свойства, но не могу найти способ получить доступ к экземпляру ChildViewModel, с которым я работаю. У этого вопроса может быть простое решение, но я не знаком с использованием кода программной части, потому что я создаю свою первую гильдию и использую подход MVVM. Я буду очень признателен за любые ответы, которые помогут мне найти рабочее решение. Кроме того, не стесняйтесь критиковать меня за использование кода с MVVM, если есть способ избежать этого и получить SaveFileDialog, используя только XAML (тогда я мог бы легко сохранить файл в ModelView).


  • Не будет способа сделать это только для XAML, но вы можете добавить ссылку на Microsoft.Win32 в свою ViewModel, привязать кнопку к команде в той же ViewModel (вместо события щелчка) и выполнить сохранение в самой ViewModel. 25.07.2012
  • Считается плохим делать что-то в отделенном коде. Пожалуйста, посмотрите на мой ответ. 25.07.2012
  • @WonkotheSane Пожалуйста, взгляните на мой ответ по этому поводу. 25.07.2012

Ответы:


1

Не уверен, где вы устанавливаете свою ViewModel, потому что вы не показали код для нее, но обычно она находится в свойстве DataContext вашего корневого элемента. Таким образом, вы могли бы просто бросить это так.

var viewModel = (ChildViewModel)this.DataContext;
25.07.2012
  • Похоже, он делает то, что мне нужно. Спасибо. 25.07.2012

  • 2

    Вы можете попробовать другой подход:

    Получите команду для вашей кнопки

    public abstract class MyCommandBase : ICommand
    {
        public abstract bool CanExecute(object o);
        public abstract void Execute(object o);
    
        public MyViewModel ViewModel { get; set; }
    
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
    }
    
    
    public class ButtonClickCommand : MyCommandBase
    {
        public ButtonClickCommand(MyViewModel vm)
        {
            base.ViewModel = vm;
        }
    
        public override bool CanExecute(object o)
        {
            return true;
        }
    
        public override void Execute(object o)
        {
            var context = this.ViewModel as MyViewModel;
            MessageBox.Show("Button was clicked for" + context.Id);
        }
    }
    

    Создайте экземпляр этой команды в своей ViewModel и сделайте для этого общедоступное свойство.

    И в вашем XAML это просто

    <Button Focusable="False" Command="{Binding CmdClickMyButton}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0">
    

    Таким образом, когда вы нажимаете кнопку, вы возвращаетесь прямо в свою ViewModel, имея всю необходимую информацию. Сохранение данных в файл не проблема.

    25.07.2012
  • Хороший ответ, хотя я не полностью согласен с вашей реализацией ButtonClickCommand (например, всегда устанавливая для CanExecute значение true или требуя экземпляр ViewModel). Обычно я предпочитаю подход Джоша Смита. 25.07.2012
  • это пример. Я хотел, чтобы он максимально приблизился к производительности. Но мне также нравится связанный подход, но в моем примере это было бы слишком, я думаю. Просто хочу получить OP из кода программной части. ;) 25.07.2012
  • Я попытаюсь переключиться на ваше решение, чтобы не использовать код позади. 25.07.2012
  • Достаточно справедливо, и ссылка на код Джоша Смита здесь, чтобы ОП тоже мог посмотреть. :) 25.07.2012
  • Пожалуйста! Это подход MVVM к таким вещам. 25.07.2012
  • Если это было полезно для вас, не стесняйтесь и примите это как ответ 26.07.2012

  • 3

    Возможно, это могло бы помочь:

    ((YourViewModelClass)YourControl.DataContext).SaveFile();

    С Уважением

    ИЗМЕНИТЬ:

    По вашему примеру:

    ((ChildViewModel)ChildView.DataContext).SaveFile();

    если вы хотите, чтобы этот код находился в коде ChildView, это было бы:

    ((ChildViewModel)this.DataContext).SaveFile();

    25.07.2012
  • Каким будет YourControl? SaveFile() не является статическим методом, поэтому мне нужно использовать правильный экземпляр моего класса модели представления. 25.07.2012
  • Да, свойство DataContext получает экземпляр модели представления, которую вы используете в данный момент. Элемент управления, в вашем случае, ChildView. я отредактирую свой ответ 25.07.2012
  • Хорошо, это работает, извините за такие подробности, я новичок в C#/XAML/WPF. 25.07.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..