Привязка функции к флажку в представлении datagrid в модели представления

#c# #winforms #mvvm #datagridview

Вопрос:

Хороший день. У меня возникли некоторые проблемы с привязкой функции к флажку внутри представления данных. Я использую форму Windows и модель mvvm. У меня есть данные в представлении datagrid и ряд флажков. Если флажок установлен, я хочу, чтобы модель представления исключала функцию с помощью оператора if.

Вот как выглядит мой пользовательский интерфейс прямо сейчас:

Вот как выглядит мой пользовательский интерфейс прямо сейчас

Например: Если я установлю первый флажок и нажму кнопку «Создать отчет о качестве программного обеспечения», я хочу, чтобы программа выполнила функцию в модели представления. Я попытался получить доступ к представлению datagrid в viewmodel, но с помощью mvvm вы не должны получать доступ к представлению из viewmodel. Как вы можете это сделать? Возможно ли иметь что-то вроде: (если datagridview1.checkbox1 == true) {…} в модели представления?

Я надеюсь, что кто-нибудь сможет дать мне общее направление.

Заранее спасибо 🙂

Я хочу использовать функцию внутри этой функции (функцию в моей модели представления).:

 private void ExecuteCreateSofwareQualityReportButtonClick()
    {
        

        OpenFileDialog OpenExcel = new OpenFileDialog()
        {
            Title = "Save Excel File",
            CheckPathExists = true,
            DefaultExt = "txt",
            Filter = "Excel files (*.xls)|*.xls",
            FilterIndex = 1,
            RestoreDirectory = true
        };

        if (OpenExcel.ShowDialog() == DialogResult.OK)
        {
            Microsoft.Office.Interop.Excel.Application xlApp;
            Microsoft.Office.Interop.Excel.Workbook xlWorkBook;

            xlApp = new Microsoft.Office.Interop.Excel.Application();
            xlWorkBook = xlApp.Workbooks.Open(OpenExcel.FileName);


            //Excel application is stopped and the process is killed
            CloseExcelProcess(xlWorkBook, xlApp);
        }

    }
 

а вот и моя модель:

 public class ApplicationModel : BindableBase
{
    private Project _selectedProject;

    private Tracker _selectedTracker;

    private string _selectedSoftwareElement;

    public BindingList<Project> ProjectList { get; set; } = new BindingList<Project>();

    public BindingList<Tracker> TrackerList { get; set; } = new BindingList<Tracker>();

    public BindingList<Item> ItemList { get; set; } = new BindingList<Item>();

    public BindingList<string> SoftwareElements = new BindingList<string>();


    public Project SelectedProject
    {
        get 
        { 
            return _selectedProject; 
        }
        set 
        { 
            SetProperty(ref _selectedProject, value);  
        }
    }

    public Tracker SelectedTracker
    {
        get 
        { 
            return _selectedTracker; 
        }
        set
        {
            SetProperty(ref _selectedTracker, value);
        }
    }

    public string SelectedSoftwareElement
    {
        get
        {
            return _selectedSoftwareElement;
        }
        set
        {
            SetProperty(ref _selectedSoftwareElement, value);
        }
    }
}
 

Я надеюсь, что это поможет

Комментарии:

1. Можете ли вы ввести часть кода viewmodel и код модели?

2. @MeysamAsadi, конечно. Я отредактирую свой вопрос

3. Альтернативно я также могу показать больше о Разногласиях, если у кого-то это есть. Мое имя Диссонанса: Мартинд#2253

4. Что такое переменная, которая привязывается к сетке данных в качестве флажка?

5. Это то, что я искал. У меня нет переменной. Я довольно новичок в кодировании и на самом деле не знаю, как работает переменная в mvvm. Я просмотрел Интернет, но смог найти ответы только на wpf. Я знаю, что мне нужно работать с PropertyChanged, но я действительно не знаю, как это сделать

Ответ №1:

Я приведу пример. Сопоставьте с ним свой код. Как использовать checkbox вход DataGrid и привязать его к viewmodel

ваша Модель

 pulic class Model : INotifyPropertyChanged
{
   public int ID { get; set; }
   public string Name { get; set; }
   private bool isCheckBox;

   public bool IsCheckBox
   {
      get { return isCheckBox; }
      set
      {
          isCheckBox = value;
          OnPropertyChange(nameof(IsCheckBox));
      }
   }
   public event PropertyChangedEventHandler PropertyChanged;

   protected void OnPropertyChange(string propertyName)
   {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
   }
}
 

теперь ViewModel

 public class MainViewModel
{
   public List<Model> myList { get; set; }
   public MainViewModel()
   {
      myList = new List<Model>()
      {
         new Model(){ ID = 1, Name = "name 1" IsCheckBox = true},
         new Model(){ ID = 2, Name = "name 2" IsCheckBox = false},
      };
   }
}
 

теперь в MainWindow.cs

 public MainWindow()
{
   this.DataContext = new MainViewModel();
}
 

теперь MainWindow.xaml

 <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding myList}">
        <DataGrid.Columns>
           <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
           <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
           <DataGridCheckBoxColumn  Header="Checkbox Column" Binding="{Binding IsCheckBox, Mode=TwoWay}"/> 
        </DataGrid.Columns>
</DataGrid>
 

Комментарии:

1. Здравствуйте, не следует ли переключить модель просмотра и модель? И я предполагаю, что MainWindow.cs-это представление

2. Спасибо вам за ваш ответ. Просто для ясности я не использую WPF

3. Нет, их не следует менять. Каждый из них является частью правил mvvm.