WPF / DataGrid: привязка к различным свойствам для отображения и редактирования - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть объект, который содержит, например, строковое свойство типа "10; 20; 30".У меня также есть свойство get, которое разбивает строку, преобразует каждую часть в двойную и суммирует их.Таким образом, у меня есть «10; 20; 30» и 60,0 (как двойные).

Теперь вопрос.Есть ли способ отобразить 60.0 (как двойной) в TextColumn, но при переходе в режим редактирования редактировать строку "10; 20; 30"?

, чтобы я мог привязать к одному свойству для отображения ипривязать к другому свойству для редактирования?

1 Ответ

0 голосов
/ 20 февраля 2019

Этого можно достичь с помощью существующего свойства, используя различные шаблоны отображения и редактирования.

Ниже CellTemplate и CellEditingTemplate можно использовать для этого.

<Grid>
    <Grid.Resources>
        <local:ValueConverter x:Key="ValueConverter"/>
        <DataTemplate x:Key="DisplayTemplate" >
            <TextBlock Text="{Binding StringProperty, 
                                      Converter={StaticResource ValueConverter}}"/>
        </DataTemplate>
        <DataTemplate x:Key="EditTemplate">
            <TextBox Text="{Binding StringProperty}"  />
        </DataTemplate>
    </Grid.Resources>
    <DataGrid Name="DG1" ItemsSource="{Binding Items}" AutoGenerateColumns="False" 
              CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Total" 
                                    CellTemplate="{StaticResource DisplayTemplate}" 
                                    CellEditingTemplate="{StaticResource EditTemplate}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Вы можетеиспользуйте IValueConverter, чтобы преобразовать обновленные строковые значения в double в соответствии с желаемым расчетом.

public class ValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            double total = 0.0d;
            foreach (var item in value.ToString().Split(';'))
                total += System.Convert.ToDouble(item.Trim());
            return total;
        }
        catch
        {
            return 0.0d;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Примечание: Вы можете добавить необходимую проверку для пользовательских значений внутри вашего ValueConverter класс.

...