关于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。
从这一点来看,问题中的代码示例是可以的。
假设:
- 人 - 模型 class 具有 Name 和 Dob 道具。
- People - Person 对象的 ObservableCollection。
- 逻辑是突出显示包含出生年份在 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>
输出:
假设我有 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。
从这一点来看,问题中的代码示例是可以的。
假设:
- 人 - 模型 class 具有 Name 和 Dob 道具。
- People - Person 对象的 ObservableCollection。
- 逻辑是突出显示包含出生年份在 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>
输出: