使用绑定转换器在silverlight中显示和更新属性
本文关键字:显示 更新 属性 silverlight 绑定 转换器 | 更新日期: 2023-09-27 18:13:28
我使用一个转换器类来显示一个基于正常工作时间(40)的名为noofweeks的属性,因此,例如,如果数据库中存储的值为40,我在数据网格列中显示1,如果它是80,我显示2,这里是我的XAML和转换器代码
<sdk:DataGridTemplateColumn Width="*" CanUserReorder="False" HeaderStyle="{StaticResource DataGridBaseHeaderStyle}" Header="FTE">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Hours, Converter={StaticResource FTEConverter}}" VerticalAlignment="Stretch" Margin="4,2" HorizontalAlignment="Stretch"></TextBlock>
</Grid>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
<sdk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Hours,Mode=TwoWay, Converter={StaticResource FTEConverter}}" VerticalAlignment="Top" Margin="4,2"
MaxLength="50" HorizontalAlignment="Stretch" >
</TextBox>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellEditingTemplate>
</sdk:DataGridTemplateColumn>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return false;
else
{
// Assumes a RowType has been passed as the bound value
Double Hours= (Double)value;
return Math.Round(Hours/40,0);
}
}
因此UserID 1和2的数据网格,其中数据库中没有小时数分别为80和120,看起来像
UserID NoOfWeeks StandardHours(not visible to user)
1 2 80
2 3 120
这是正常工作,如预期的那样,现在我想更新基于NoOfWeeks由用户修改的数据库中的小时。
例如,在上面的表中,如果UserID的用户将NoOfWeeks更新为4,我想将小时保存为160(4 *40)。
UserID NoOfWeeks StandardHours(用户不可见)1 4 1602 3 120我在这里有点困惑,我如何更新属性?
对于那些不熟悉MVVM和转换器的人,我所做的是使用ConvertBack方法将用户输入转换为Hours
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return false;
else
{
// Assumes a RowType has been passed as the bound value
string val = (string)value;
double doubleValue = double.TryParse(val, out doubleValue) ? doubleValue : 0;
return doubleValue * 40;
}
}
}
需要注意的一点是,如果用户输入文本或数字以外的任何东西,我将把值转换为0。这可能不符合您的要求,您可以在属性设置中使用IDataErrorInfo来阻止并通知用户输入不允许的值。