我应该将代码从文件后面的代码移动到ViewModel

时间:2014-11-25 20:14:53

标签: wpf mvvm

我在窗口中有按钮和滑块。我还有一个按钮点击事件。问题是我在后面的代码中使用了click事件。不过我也采用了MVVW模式。所以我想我可以用ICommand等转换代码。我不确定这是否是一个正确的决定。

请查看我的代码并告知我。我是ICommandCanExecute的新手。

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等?

2 个答案:

答案 0 :(得分:0)

是的,您还在操纵数据,而不仅仅是视觉效果,因此它绝对属于ViewModel。

要从注释中进一步解决您的问题,您不能直接访问控件,而是在ViewModel中设置布尔变量并使用它。另外,对于设置颜色,您可以使用setter甚至自定义控件,具体取决于确切的需求。有多种方法可以做到。

答案 1 :(得分:0)

如果您正在操作数据(没有固有的可视化表示的东西),那么继续转动按钮 - 单击命令并将它们放在您的视图模型中。这样,作用于数据的逻辑与VM中的数据一起存在。如果您正在操纵控件的可视状态,请在后面的代码中执行。

您的控件通过视图的DataContext属性引用VM非常好。您的ViewModel不能引用您的View。如果这样做,你已经将数据的可视化表示与数据本身相结合,MVVM的全部意义就是避免这种情况。

此外,如果您发现自己编写了VM属性,例如ButtonEnabled或HighlightColor(意图在视图层中的东西),那么就会出现问题。