将函数绑定到视图模型中数据网格视图中的复选框
Bind a function to a checkbox in a datagridview in the viewmodel
美好的一天。我在将函数绑定到 datagridview 中的复选框时遇到一些问题。我正在使用 windows 形式和 mvvm 模型。我在 datagridview 中有一个数据和一行复选框。如果选中复选框,我希望视图模型使用 if 语句执行函数。
这是我的 UI 现在的样子:
例如:如果我选中第一个复选框并按下“创建软件质量报告”按钮,我希望程序在视图模型中执行一个函数。我尝试访问 viewmodel 中的 datagridview,但是使用 mvvm 你不应该从 viewmodel 访问视图。你怎么能这样做?是否有可能在视图模型中有类似的东西:(if 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);
}
}
}
希望对您有所帮助
我来举个例子。将您的代码与它匹配。如何在 DataGrid
中使用 checkbox
并将其绑定到 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>
美好的一天。我在将函数绑定到 datagridview 中的复选框时遇到一些问题。我正在使用 windows 形式和 mvvm 模型。我在 datagridview 中有一个数据和一行复选框。如果选中复选框,我希望视图模型使用 if 语句执行函数。
这是我的 UI 现在的样子:
例如:如果我选中第一个复选框并按下“创建软件质量报告”按钮,我希望程序在视图模型中执行一个函数。我尝试访问 viewmodel 中的 datagridview,但是使用 mvvm 你不应该从 viewmodel 访问视图。你怎么能这样做?是否有可能在视图模型中有类似的东西:(if 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);
}
}
}
希望对您有所帮助
我来举个例子。将您的代码与它匹配。如何在 DataGrid
中使用 checkbox
并将其绑定到 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>