我正在尝试将事件、处理程序、EventSetter等WPF事件转换为CodeBehid模式。我不允许使用System.Windows.Controls,因为我使用的是MVVM。我也在避免使用第三方库来解决这个问题。
谁能解释一下如何将下面的CodeBehind事件处理程序转换成MVVM事件处理程序?请在写答案时尽可能多地解释。
XAML代码
<DataGridCheckBoxColumn Header="Select" Binding="{Binding Path=IsSelected}">
<DataGridCheckBoxColumn.CellStyle>
<Style TargetType="DataGridCell">
<EventSetter Event="MouseLeftButtonUp" Handler="ApprovedMouseUp"></EventSetter>
</Style>
</DataGridCheckBoxColumn.CellStyle>
</DataGridCheckBoxColumn> 代码隐藏
private void ApprovedMouseUp(object sender, MouseButtonEventArgs e)
{
if(sender is DataGridCell)
{
var temp = (sender as DataGridCell).Content;
if(temp is CheckBox) (temp as CheckBox).IsChecked = !(temp as CheckBox).IsChecked;
}
} 发布于 2011-10-19 12:58:36
关于MVVM,有几条经验法则...
您的Models和ViewModles不应引用System.Windows.Controls namespace.
Models,而ViewModles不应处理事件。为that.
RoutedCommand使用ICommand接口在Models / ViewModels中无效(由于第2点)。因此,请使用DelegateCommand / RelayCommand 话虽如此,如果你已经在MVVM中写了一个,那么以上所有的几点都是完全允许的。
发布于 2011-10-19 11:10:06
您有几个选择:
中的事件
只要您不想在样式或模板中设置这些事件处理程序,我建议使用选项#1 --没有铁律禁止您在方便的时候使用事件处理程序,只要视图模型实际执行所有工作
编辑:选项#1
private void ApprovedMouseUp(object sender, MouseButtonEventArgs e)
{
if(sender is DataGridCell)
{
var checkBox= (sender as DataGridCell).Content as CheckBox;
if(checkBox != null)
{
var viewModel = (MyViewModel)checkBox.DataContext;
viewModel.ToggleApprovedStatus();
}
}
} 发布于 2011-10-19 13:50:01
还可以使用Caliburn Micro库将ViewModel中的处理程序附加到视图中的事件。
示例代码:
... xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"....
<Button Content="Edit" DataContext="{Binding Path=VmInstance}"
cal:Message.Attach="[Event Click] = [Action EditFilter]" />https://stackoverflow.com/questions/7816067
复制相似问题