- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 MVVM (C#) 和 XAML 使用 Caliburn.Micro 库编写了一个简单的程序,但是有些操作不起作用:
如有任何帮助,我们将不胜感激。
我的 GUI 代码:
// Views\MainView.xaml
<Window x:Class="ListBox_CaliburnMicro.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:vm="clr-namespace:ListBox_CaliburnMicro"
WindowStartupLocation="CenterScreen"
Title="MainWindow" Height="300" Width="600">
<Grid>
<Grid.DataContext>
<vm:MainViewModel/>
</Grid.DataContext>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="153*"/>
</Grid.ColumnDefinitions>
<Button Content="Add" Command="{Binding AddCommand}" Grid.Column="1" HorizontalAlignment="Left" Margin="10,37,0,0" VerticalAlignment="Top" Width="75" ToolTip="Add item end of list" Background="White" Foreground="Black" Height="22"/>
<Button Content="Delete" Command="{Binding DeleteCommand}" Grid.Column="1" HorizontalAlignment="Left" Margin="96,37,0,0" VerticalAlignment="Top" Width="75" ToolTip="Delete first item from list" Background="White" Foreground="Black" Height="22"/>
<Button Content="Update" Command="{Binding UpdateCommand}" Grid.Column="1" HorizontalAlignment="Left" Margin="184,37,0,0" VerticalAlignment="Top" Width="75" ToolTip="Update first item from list" Background="White" Foreground="Black" Height="22"/>
<Button Content="GetSelectedItem" Command="{Binding GetSelectedItemCommand}" Grid.Column="1" HorizontalAlignment="Left" Margin="271,37,0,0" VerticalAlignment="Top" Width="95" ToolTip="get selected item from list" Background="White" Foreground="Black" Height="22"/>
<Button Content="GetItem:" Command="{Binding GetItemXCommand}" Grid.Column="1" HorizontalAlignment="Left" Margin="377,37,0,0" VerticalAlignment="Top" Width="75" ToolTip="get item x, from list" Background="White" Foreground="Black" Height="22"/>
<TextBox Grid.Column="1" x:Name="ItemX" Text="0" HorizontalAlignment="Left" Height="24" Margin="457,35,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="70"/>
<ListView Grid.Column="1" x:Name="FileListView" ItemsSource="{Binding Path=Files}" VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch" Margin="10,65,10,10" Foreground="Black" Background="#FFE6EEF7">
<ListView.View>
<GridView>
<GridViewColumn Header="Status" Width="Auto"
DisplayMemberBinding="{Binding FileStatus}"/>
<GridViewColumn Header="Name" Width="Auto"
DisplayMemberBinding="{Binding FileName}"/>
<GridViewColumn Header="Size" Width="Auto"
DisplayMemberBinding="{Binding FileSize}"/>
<GridViewColumn Header="System Type" Width="Auto"
DisplayMemberBinding="{Binding FileType}"/>
<GridViewColumn Header="Email Count" Width="Auto"
DisplayMemberBinding="{Binding FileEmailCount}"/>
<GridViewColumn Header="Info Count" Width="Auto"
DisplayMemberBinding="{Binding FileInfoCount}"/>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
我的模型是:
// Model\File.cs
using System;
namespace ListBox_CaliburnMicro.Model
{
public class File
{
private Guid _FileID;
public Guid FileID
{
get
{
return _FileID;
}
set
{
_FileID = value;
}
}
public string FileStatus { get; set; }
public string FileName { get; set; }
public string FileSize { get; set; }
public string FileType { get; set; }
public string FileEmailCount { get; set; }
public string FileInfoCount { get; set; }
public File()
{
FileID = Guid.NewGuid();
}
public File(string s1 = "", string s2 = "", string s3 = "", string s4 = "", string s5 = "", string s6 = "")
{
FileID = Guid.NewGuid();
FileStatus = s1;
FileName = s2;
FileSize = s3;
FileType = s4;
FileEmailCount = s5;
FileInfoCount = s6;
}
}
}
我的命令处理程序代码:
// ViewModels\CommandHandler.cs
using System;
using System.Windows.Input;
namespace ListBox_CaliburnMicro.ViewModels
{
public class CommandHandler : ICommand
{
private System.Action _action;
private bool _canExecute;
public CommandHandler(System.Action action, bool canExecute)
{
_action = action;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
_action();
}
}
}
还有我的 ViewModel:
// ViewModels\MainViewModel.cs
using Caliburn.Micro;
using ListBox_CaliburnMicro.Model;
using ListBox_CaliburnMicro.ViewModels;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace ListBox_CaliburnMicro
{
public class MainViewModel : Screen, INotifyPropertyChanged
{
public MainViewModel()
{
FillDataFile();
_canAddCommandExecute = true;
_canDeleteCommandExecute = false;
_canUpdateCommandExecute = false;
_canGetSelectedItemCommandExecute = false;
_canGetItemXCommandExecute = false;
}
#region File listView
private ObservableCollection<File> _Files;
public ObservableCollection<File> Files
{
get { return _Files; }
set
{
_Files = value;
OnPropertyChanged("Files");
}
}
private void FillDataFile()
{
_Files = new ObservableCollection<File>();
for (int i = 0; i < 0; i++)
{
_Files.Add(new File() { FileStatus = "status", FileName = "name", FileSize = "size", FileType = "type", FileEmailCount = "email_count", FileInfoCount = "info_count" });
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
#region ItemX textbox
private string _ItemX = "0";
public string ItemX
{
get
{
return _ItemX;
}
set
{
_ItemX = value;
}
}
#endregion
#region command button
#region Add button with Command
private ICommand _AddCommand;
public ICommand AddCommand
{
get
{
return _AddCommand ?? (_AddCommand = new CommandHandler(() => AddAction(), _canAddCommandExecute));
}
}
static int nIndex = 0;
private bool _canAddCommandExecute;
public void AddAction()
{
string strName = string.Format("{0}", nIndex++);
_Files.Add(new File() { FileStatus = "status", FileName = strName, FileSize = "size", FileType = "type", FileEmailCount = "email_count", FileInfoCount = "info_count" });
// enabled action buttons,
// !!! but not worded !!!
_canAddCommandExecute = true;
_canDeleteCommandExecute = true;
_canUpdateCommandExecute = true;
_canGetSelectedItemCommandExecute = true;
_canGetItemXCommandExecute = true;
}
#endregion
#region Delete button with Command
private ICommand _DeleteCommand;
public ICommand DeleteCommand
{
get
{
return _DeleteCommand ?? (_DeleteCommand = new CommandHandler(() => DeleteAction(), _canDeleteCommandExecute));
}
}
private bool _canDeleteCommandExecute;
public void DeleteAction()
{
if (_Files.Count > 0)
_Files.RemoveAt(0);
}
#endregion
#region Update button with Command
private ICommand _UpdateCommand;
public ICommand UpdateCommand
{
get
{
return _UpdateCommand ?? (_UpdateCommand = new CommandHandler(() => UpdateAction(), _canUpdateCommandExecute));
}
}
private bool _canUpdateCommandExecute;
public void UpdateAction()
{
if (_Files.Count > 0)
{
// update FileName field
_Files[0].FileName = "+"; // !!! but didn't work !!!
// List<File> FilesSelect = _Files.Where(p => p.FileID == _Files[0].FileID).ToList();
}
}
#endregion
#region GetSelectedItem button with Command
private ICommand _GetSelectedItemCommand;
public ICommand GetSelectedItemCommand
{
get
{
return _GetSelectedItemCommand ?? (_GetSelectedItemCommand = new CommandHandler(() => GetSelectedItemAction(), _canGetSelectedItemCommandExecute));
}
}
private bool _canGetSelectedItemCommandExecute;
public void GetSelectedItemAction()
{
if (_Files.Count > 0)
{
// ... get selected item in ListView
}
}
#endregion
#region GetItemX button with Command
private ICommand _GetItemXCommand;
public ICommand GetItemXCommand
{
get
{
return _GetItemXCommand ?? (_GetItemXCommand = new CommandHandler(() => GetItemXAction(), _canGetItemXCommandExecute));
}
}
private bool _canGetItemXCommandExecute;
public void GetItemXAction()
{
if (_Files.Count > 0)
{
// ... get item 'X' that enter in TextBox control
}
}
#endregion
#endregion
}
}
最佳答案
更新项目内容。 要在您的 View 中查看更新的模型项,您应该在模型的 EACH 属性中实现 INotifyPropertyChanged
事件。例如:
public class File:INotifyPropertyChanged
{
private Guid _FileID;
public Guid FileID
{
get
{
return _FileID;
}
set
{
_FileID = value;
OnPropertyChanged("FileID");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
获取所选项目。在 ViewModel 中创建一个属性以保存所选项目,例如 File
:
public File SelectedFile { get; set; }
然后将 ListView
的 SelectedItem
绑定(bind)到这个属性:
<ListView Name="UserGrid" SelectedItem="{Binding SelectedFile}"
ItemsSource="{Binding Path=Files}"/>
在你实现SelectedFile
属性后,你可以像这样获取值:
if(SelectedFile!=null)
var exactFile=SelectedFile;
点击添加按钮时启用或禁用按钮。您有两种方式:使用 Caliburn 和不使用 Caliburn
使用 CaliburnMicro:CaliburnMicro 有自己的机制来处理 Button Click
事件。例如:
<Button Content="ShowPageTwo">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="ShowPageTwo" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
要查看有关实现的更多详细信息,请参阅 official guide at CodePlex .
没有 CaliburnMicro:
首先,您应该创建 RelayCommand
类,通过调用委托(delegate)将其功能传递给其他对象:
public class RelayCommand : ICommand
{
#region Fields
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;
#endregion // Fields
#region Constructors
public RelayCommand(Action<object> execute)
: this(execute, null)
{
}
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
#endregion // Constructors
#region ICommand Members
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
_execute(parameter);
}
#endregion // ICommand Members
}
然后在您的 viewModel 中创建一个属性。例如:
public class YourViewModel
{
public RelayCommand YourCommand { get; set; }
public YourViewModel()
{
YourCommand = new RelayCommand(DoSmth, CanDoSmth);
}
private void DoSmth(object obj)
{
Message.Box("Hello from viewModel");
}
private bool CanDoSmth(object obj)
{
//you could implement your logic here. But by default it should be
//set to true
return true;
}
}
XAML 应该是这样的:
<Button Content="Click me!" Command="{Binding LoginCommand}"/>
关于c# - 如何在 C# 中使用 Caliburn.Micro 更新 ListView 中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35174319/
所以我在 Caliburn.Micro 上摆弄了一下,突然发现了一些有趣的东西。 我有一个名为 Maximum 的 ViewModel 属性,类型为 int,通过命名约定与 CM 自动绑定(bind)
如果我的 View 中有一个名为 Save 的按钮,那么我可以将 Save 属性添加到我的 ViewModel,Caliburn.Micro 会自动将它绑定(bind)到我的按钮的内容。例如: pub
我将 ViewModels 绑定(bind)到 ContentControls 并让 Caliburn 负责创建和绑定(bind) View 。但是,我想根据我绑定(bind)的 ContentCon
我一直在尝试将 Caliburn.Micro MVVM 框架集成到我处于中间位置的 C# WPF 项目中。 我目前只有三个 View 模型: ShellViewModel -(带有 ContentCo
Caliburn.Micro 是否有与 Catel's 类似的功能? [ExposeAttribute] ? 有没有其他方法可以减轻 Caliburn.Micro 中传递属性的工作? (即模型中的属性
我这样做: 问题是,这同时是主窗口上定义的主导体,我用它控制通过其他窗口的导航,所以我不能从 MetroWindow 继承,至少尝试更改 ViewModel 中的标题: public class S
我知道,没有办法直接在 Amazon 上从 t1.micro 迁移到 t2.micro。 那么,它会工作吗: 从当前 t1 中分离 EBS 卷 创建新的 t2.micro 实例 将 EBS vol 附
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我已在 MongoDb 配置文件中启用分析。 profile=2 slowms=5 mongodb 日志包含所有耗时超过 5 毫秒的查询(奇怪,我认为 profile=2 意味着记录所有查询)。 对于
我试图弄清楚如何成功地让 Caliburn Micro 在 Windows Phone 8.1 应用程序中从一个页面导航到另一个页面。 我的第一页加载得很好,正如我的 App 类中所指定的: prot
我尝试使用 Google 的 UI 在我的集群中启动一个新的 f1-micro 节点,但它默默地失败了。所以我决定使用 gcloud 运行它,看看它是否提供了更多细节 所以我运行了以下 gcloud
我正在使用 Arduino Micro 在我拥有的前端触发特定事件。然而,出于某种原因,一些关键组合只是随机触发。发生这种情况时,我什至没有接触 arduino。 我已经设置好了,当你按下一个按钮时,
我刚刚开始开发一个简单的 Restful 服务。我的文件夹结构如下: root - /api --/api/customers.php 例如,在浏览器中我打算调用http://domain/api/c
我有一些包含一定数量不同字符串的文件(大约 100.000 个取自产品)。需要找出处理该文件中每个字符串的函数的 99%、99.9%。 我尝试使用jmh来编写基准测试。但是,我只能找到批处理函数(处理
有没有办法在android中检测micro sd卡?我知道 Environment 类提供了外部存储的详细信息。但它只是提供了内置 SD 卡的详细信息。有办法解决吗? 最佳答案 您可以使用 isExt
问题是关于将 go-micro 包装器用作单独的服务 - 如果有人知道如何正确使用它,请告诉我。我的例子 - authWrapper,所以所有的 api 服务都应该能够使用它,它应该通过标准服务发现来
我有 Angular 6 微前端应用程序。它在主应用程序中有 4 个不同的应用程序。我如何在这些应用程序之间实现路由。我如何在主应用程序(我在主应用程序中有很多子路由)和子应用程序中实现路由。我正在使
我正在开发一个使用 Caliburn Micro 的 WPF 项目。我遇到了一个问题,即第二次打开 View 时, View 中的控件没有得到更新。第一次数据绑定(bind)工作正常。 当我第二次调用
在我的 WPF Caliburn.Micro 应用程序中,我有一个 TabControl。我希望能够根据需要关闭标签。我在这里找到了一种方法: http://devlicio.us/blogs/rob
我有一个使用WPF应用程序的场景,该应用程序托管一些带有其视图模型的视图(用户控件),这些视图模型是MEF在其插件文件夹中导出的部件。该应用程序将其数据与配置文件一起加载,该文件还指示应在可用零件中导
我是一名优秀的程序员,十分优秀!