#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.