使用Binding转换器在Silverlight中显示和更新属性

时间:2013-05-14 00:17:17

标签: c# silverlight mvvm

我正在使用转换器类根据正常工作时间显示一个名为noofweeks的属性(40),例如,如果存储在数据库中的值为40,我在datagrid列中显示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);
              }
          }

所以数据网格中的用户ID 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 160    2 3 120 我在这里有点困惑,如何更新属性?

1 个答案:

答案 0 :(得分:1)

对于那些不熟悉MVVM和转换器的人,我所做的是使用ConvertBack方法将用户输入转换为小时

 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来停止并通知用户输入值是不允许的。