Как я могу получить DataGrid для сортировки, которая поддерживает ObservableCollection, когда сортируется сама сетка? - PullRequest
1 голос
/ 21 июня 2011

У меня есть сетка, привязанная к списку объектов, SelectedIndex привязана к свойству, я хочу это SelectedIndex, которое работает корректно при изменении индекса при сортировке, однако коллекция в модели не сортируется, поэтому индекс не относится к модели.

Разметка в представлении:

<DataGrid Name="gridCustomers"
          ItemsSource="{Binding Customers}"
          SelectedIndex="{Binding SelectedIndex}"
          CanUserSortColumns="True"
          SelectionUnit="FullRow">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Customer" Binding="{Binding ID}" />
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
    </DataGrid.Columns>
</DataGrid>

Код в модели

public ObservableCollection<Customer> Customers {
    get;
    private set;
}

private int selectedIndex;
public int SelectedIndex {
    get { return selectedIndex; }
    set {
        if (selectedIndex != value) {
            selectedIndex = value;
            OnNotifyPropertyChanged("SelectedIndex");
            OnNotifyPropertyChanged("SelectedCustomer");
        }
    }
}

public Customer SelectedCustomer {
    get { return CustomersView[selectedIndex]; }
}

Я использую этот подход, потому что яиметь кнопки «следующий / предыдущий» и ярлык с привязкой к «x of y customer».SelectedCustomer - это вспомогательное свойство для дочернего элемента управления, которое в этом случае показывает неверный объект.

1 Ответ

1 голос
/ 21 июня 2011

Мне удалось решить эту проблему, используя свойства привязки SelectedIndex и SelectedItem и не перемещаясь по самому списку.

Просмотр:

<DataGrid Name="gridCustomers"
            ItemsSource="{Binding Path=Customers}"
            SelectedIndex="{Binding SelectedIndex}"
            SelectedItem="{Binding SelectedCustomer}"

Модель:

public ObservableCollection<Customer> Customers {
    get;
    private set;
}

private int selectedIndex;
public int SelectedIndex {
    get { return selectedIndex; }
    set {
        if (selectedIndex != value) {
            selectedIndex = value;
            OnNotifyPropertyChanged("SelectedIndex");
            OnNotifyPropertyChanged("NavText");
        }
    }
}

private Customer selectedCustomer;
public Customer SelectedCustomer {
    get { return selectedCustomer; }
    set {
        if (!Object.Equals(selectedCustomer, value)) {
            selectedCustomer = value;
            OnNotifyPropertyChanged("SelectedCustomer");
        }
    }
}

public string NavText {
    get {
        if (Customers.Count == 0)
            return "No Customers";
        if (SelectedIndex == -1)
            return String.Format("{0} customers", customers.Count);
        return String.Format("{0} of {1}", SelectedIndex + 1, Customers.Count);
    }
}

public void First() {
    if (Customers.Count == 0)
        return;
    SelectedIndex = 0;
}

public void Last() {
    if (Customers.Count == 0)
        return;
    SelectedIndex = Customers.Count - 1;
}

public void Next() {
    if (Customers.Count == 0 || SelectedIndex == Customers.Count - 1)
        return;
    SelectedIndex++;
}

public void Previous() {
    if (Customers.Count == 0 || SelectedIndex <= 0)
        return;
    SelectedIndex--;
}
...