我在窗口中有按钮和滑块。我还有一个按钮点击事件。问题是我在后面的代码中使用了click事件。不过我也采用了MVVW模式。所以我想我可以用ICommand
等转换代码。我不确定这是否是一个正确的决定。
请查看我的代码并告知我。我是ICommand
和CanExecute
的新手。
MainViewModel _dataContext;
public MainWindow()
{
InitializeComponent();
_dataContext = new MainViewModel();
this.DataContext = _dataContext;
_dataContext.ServerString = " Connected to Server " + ConfigurationManager.AppSettings["Server"]";
}
private async void buttonStart_Click(object sender, RoutedEventArgs e)
{
try
{
cTokenSource = new buttonCancellationTokenSource();
cToken = cTokenSource.Token;
paymentTestNumber = count;
buttonStart.IsEnabled = false;
buttonStart.IsHitTestVisible = false;
buttonStart.Background = Brushes.Red;
buttonCancel.IsEnabled = true;
buttonCancel.Background = Brushes.Green;
buttonCancel.IsHitTestVisible = true;
_dataContext.Items.Clear();
_dataContext.PaymentTotal = PaymentTotal;
_dataContext.TotalSuccess = string.Empty;
_dataContext.TotalFail = string.Empty;
m_Queue = new BufferBlock<AppointmentReminder>(new DataflowBlockOptions { BoundedCapacity = 1000 }); // bufferBlock
slider.IsEnabled = false;
var producer = Producer(paymentTestNumber);
var consumer = Consumer();
await Task.WhenAll(producer, consumer);
Summary();
slider.IsEnabled = true;
cTokenSource = null;
}
对于查看模型。
public class MainViewModel : NotifyUIBase
{
private string serverString;
public string ServerString
{
get { return serverString; }
set
{
serverString = value;
RaisePropertyChanged();
}
}
public ObservableCollection<Calls> items = new ObservableCollection<Calls>();
public ObservableCollection<Calls> Items
{
get { return items; }
set
{
items = value;
RaisePropertyChanged();
}
}
它运作良好,但它可能违反MVVM原则。
所以我的问题是:我是否需要将事件buttonStart_Click
转换为ICommand
等?
答案 0 :(得分:0)
是的,您还在操纵数据,而不仅仅是视觉效果,因此它绝对属于ViewModel。
要从注释中进一步解决您的问题,您不能直接访问控件,而是在ViewModel中设置布尔变量并使用它。另外,对于设置颜色,您可以使用setter甚至自定义控件,具体取决于确切的需求。有多种方法可以做到。
答案 1 :(得分:0)
如果您正在操作数据(没有固有的可视化表示的东西),那么继续转动按钮 - 单击命令并将它们放在您的视图模型中。这样,作用于数据的逻辑与VM中的数据一起存在。如果您正在操纵控件的可视状态,请在后面的代码中执行。
您的控件通过视图的DataContext属性引用VM非常好。您的ViewModel不能引用您的View。如果这样做,你已经将数据的可视化表示与数据本身相结合,MVVM的全部意义就是避免这种情况。
此外,如果您发现自己编写了VM属性,例如ButtonEnabled或HighlightColor(意图在视图层中的东西),那么就会出现问题。