0

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

所以数据库中的小时数分别为 80 和 120 的 UserID 1 和 2 的数据网格看起来像

 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 我对如何更新属性感到有些困惑?

4

1 回答 1

1

对于那些不熟悉 MVVM 和 Converters 的人,我所做的是使用 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 来停止并通知用户输入不允许的值.

于 2013-05-14T01:01:44.220 回答