使用绑定转换器在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我在这里有点困惑,我如何更新属性?

使用绑定转换器在silverlight中显示和更新属性

对于那些不熟悉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来阻止并通知用户输入不允许的值。