关于XAML、代码隐藏和MVVM

About XAML, code-behind and MVVM

假设我有 DataGrid 视图。我还有带有一些对象集合的视图模型。 DataGrid 绑定到集合。目标是根据对象 属性 的值设置行的颜色。关于 MVVM 是否像下面的代码一样在代码隐藏中执行此操作是正确的方法?

private void ScheduleGrid_OnLoadingRow(object sender, DataGridRowEventArgs e)
{
    var schedule = e.Row.DataContext as OrderScheduleModel;
    if(schedule==null)
        return;
    if (schedule.Date.DayOfWeek == DayOfWeek.Saturday || schedule.Date.DayOfWeek == DayOfWeek.Sunday)
    {
        e.Row.Background = new SolidColorBrush(Color.FromArgb(0xff, 0x90, 0xee, 0x90));
    }
}

我知道我可以创建行为、附加 属性、样式等。但是 基本上,MVVM 是否允许在代码隐藏中使用视图 _based_on_view-model_ 进行操作?

作为一种模式,MVVM 的目标是将视图与视图模型和模型分开。

一堆 MVVM 和 XAML 假设视图和视图模型使用数据绑定相互通信。数据绑定可能是 最好的 方式,但不是 唯一的 方式。在您的代码不将 UI 逻辑引入 VM 之前,反之亦然,这仍然是 MVVM。

从这一点来看,问题中的代码示例是可以的。

假设:

  1. 人 - 模型 class 具有 Name 和 Dob 道具。
  2. People - Person 对象的 ObservableCollection。
  3. 逻辑是突出显示包含出生年份在 2000 年之前的人的行。

转换器:

public class DobToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is DateTime)
        {
            var brush = new SolidColorBrush(Colors.Transparent);

            var dob = (DateTime)value;

            if (dob.Year <= 2000)
            {
                brush.Color = Colors.LightGray;
            }

            return brush;
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML:

<Grid>
    <Grid.Resources>
        <local:DobToColorConverter x:Key="DobToColor" />
    </Grid.Resources>

    <DataGrid ItemsSource="{Binding People}">
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Setter Property="Background" Value="{Binding Dob, Converter={StaticResource DobToColor}}" />
            </Style>
        </DataGrid.RowStyle>
    </DataGrid>
</Grid>

输出: