Сортируемый вид списка WPF с флажком в шаблоне MVVM - PullRequest
0 голосов
/ 20 октября 2011

У меня есть WPF ListView с флажком в шаблоне MVVM.Мне нужно выполнить следующие две задачи.

1) Сортировать по любому столбцу, когда я нажимаю на заголовок столбца.Если столбец уже находится в порядке возрастания, он должен изменить порядок в порядке убывания и наоборот.

2) SelectedTaskItem не связывается с ViewModel, когда я устанавливаю или снимаю флажок.

TaskView.xaml

 <UserControl x:Class="MyProject.TaskView"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Height="569" Width="954" 
              HorizontalContentAlignment="Center" 
              VerticalContentAlignment="Center" 
   >


    <UserControl.Resources>
       <DataTemplate x:Key="FirstCellCheckBox">
         <CheckBox 
                Command="{Binding IsSelected, Mode= TwoWay}"
                IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource 
                FindAncestor, AncestorType={x:Type ListViewItem}}}"
                CommandParameter="{Binding Path=SelectedTaskItem, 
                ElementName=dgTaskList, UpdateSourceTrigger=PropertyChanged}" 
                />

      </DataTemplate>

    </UserControl.Resources>
    <ListView Grid.Row="1" 
              Name="ListViewTask" 
              Margin="12,49,26,79"  
              ItemsSource="{Binding TaskList}" 
              ScrollViewer.HorizontalScrollBarVisibility="Auto"  
             >

        <ListView.View >
            <GridView x:Name="gvTaskList">
                <GridViewColumn Header="Select" 
                                CellTemplate="{StaticResource FirstCellCheckBox}" 
                                Width="30"/>

                <GridViewColumn Header="Internal File" 
                                DisplayMemberBinding="{Binding TaskID}"  
                                Width="100"/>

                <GridViewColumn Header="TaskDescription" 
                                DisplayMemberBinding="{Binding TaskDescription}"  
                                Width="100" />

                <GridViewColumn Header="Task Status" 
                                DisplayMemberBinding="{Binding TaskStatus}" 
                                Width="100" />
            </GridView>
        </ListView.View>
    </ListView> 

TaskViewModel.cs

 namespace MyProject
 {
  public class TaskViewModel: ViewModelBase
  {
    ObservableCollection<TaskModel> _TaskList;

    public TaskViewModel()
    {
         TaskDAO dal = new TaskDAO();
         _TaskList= dal.GetUpFileList();        
   }


    public ObservableCollection<TaskModel> TaskList 
    {
        get { return _TaskList; }

        set
        {
            if (_TaskList!= value)
            {
                this._TaskList= value;
                this.OnPropertyChanged("TaskList");
            }
        }
    }


    private TaskModel _selectedTaskItem;
    public TaskModel SelectedTaskItem
    {
        get { return _selectedTaskItem; }
        set
        {
            if (value != null)
            {
                _selectedTaskItem= value;
                OnPropertyChanged("SelectedTaskItem");
                if (null != _selectedTaskItem)
                {
                    ObservableCollection<TaskModel> oCol =
                        new ObservableCollection<TaskModel>();
                    foreach (TaskModel itm in TaskList)
                    {
                        if (itm.TaskID == _selectedTaskItem.TaskID)
                        {
                            itm.IsSelected = true;
                        }
                        oCol.Add(itm);

                    }
                    TaskList.Clear();
                    TaskList = oCol;
                    OnPropertyChanged("TaskList");
                }
            }

        }

    } 
  }

1 Ответ

1 голос
/ 20 октября 2011

Вы связываете значение IsChecked CheckBox с ListBoxItem.IsChecked, но я не вижу ничего, что связывает ListBoxItem.IsChecked с вашей ViewModel.

Попробуйте добавить следующее в список ListBox.Resources

<Style TargetType="{x:Type ListBoxItem}">
    <Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>

Для сортировки я бы рекомендовал использовать DataGrid вместо ListView, поскольку сортировка встроена в DataGrid. Если вы не хотите этого делать, вам, вероятно, придется сделать несколько пользовательских ListViewHeaders, которые будут выполнять SortCommand в вашей ViewModel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...