Добавьте номер индекса членов ViewModel в качестве номера строки в DataGrid.

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

<DataGridTextColumn Header="NO" Width="22" IsReadOnly="True" x:Name="rowNumber">
                    <DataGridTextColumn.HeaderStyle>
                        <Style TargetType="{x:Type DataGridColumnHeader}">
                            <Setter Property="FontSize" Value="10" />
                            <Setter Property="Margin" Value="0"/>
                        </Style>
                    </DataGridTextColumn.HeaderStyle>
                    <DataGridTextColumn.Binding>
                        <MultiBinding Converter="{StaticResource rowNumberConverter}">
                            <Binding />
                            <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}" />
                        </MultiBinding>
                    </DataGridTextColumn.Binding>
                </DataGridTextColumn>

И конвертер:

class RowNumberConverter : IMultiValueConverter
    {
        #region IMultiValueConverter Members

        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {

            //get the grid and the item
            Object item = values[0];
            DataGrid grid = values[1] as DataGrid;

            int index = grid.Items.IndexOf(item) + 1 ;

            return index.ToString().PadLeft(2, '0');
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }

Однако это не соответствует нашему новому требованию — нумерации страниц. Этот преобразователь, конечно, не будет продолжать подсчет, поскольку он ссылается только на строки в DataGrid.

Может ли кто-нибудь указать мне, как сделать так, чтобы количество строк продолжалось на следующей странице? Необходимо придерживаться чистого шаблона MVVM.

Спасибо за вашу помощь.


person eemwingg    schedule 07.01.2014    source источник
comment
OMG, это ужасно и определенно не MVVM!! Вы не должны обращаться к элементам пользовательского интерфейса в таком конвертере. Попробуйте выполнить привязку к свойствам DataGrid.ItemsSource или DataGrid.Items вместо всего DataGrid.   -  person Sheridan    schedule 07.01.2014
comment
Посмотрите здесь: [Как отобразить номера строк в ListView?] [1] [1]: stackoverflow.com/questions/660528/   -  person gomi42    schedule 07.01.2014


Ответы (1)


Я думаю о модели представления просто как об элементе, который предоставляет все данные для отображения. Если есть требование отображать номера элементов, то просто добавьте еще одно свойство к отображаемому элементу.

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

person Sheridan    schedule 07.01.2014
comment
Это имеет смысл, и я смогу избежать уродства, на которое вы указали выше. Я пытался выяснить, есть ли способ динамически добавлять эти числа. - person eemwingg; 07.01.2014
comment
Существует... просто прокручивайте свою коллекцию в модели представления и каждый раз устанавливайте соответствующий номер. - person Sheridan; 07.01.2014
comment
Да, это то, что я сделал. Я хотел посмотреть, есть ли способ сделать это, воздействуя только на View. Еще раз спасибо за вашу помощь, как всегда. - person eemwingg; 08.01.2014