Выбранные элементы управления ListView чекбокс в MVVM в WPF



Я хочу передать выбранные элементы ListView checkbox в view model, позже я буду использовать дальнейший процесс для хранения в базе данных.



Код в виде недели.xaml as



<Window.DataContext>
<Binding Source="{StaticResource Locator}" Path="TaskExecDefModel"></Binding>
</Window.DataContext>
<Window.Resources>
<ResourceDictionary>
<DataTemplate x:Key="ItemDataTemplate">
<CheckBox
x:Name="checkbox"
Content="{Binding}" Command="{Binding CheckBoxCommand}" CommandParameter="{Binding ElementName=checkedListView, Path=SelectedItems}"
IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
</DataTemplate>
</ResourceDictionary>

<StackPanel Grid.Column="1" Grid.Row="3" Margin="5">
<CheckBox x:Name="selectAll" Content="Select all" Click="OnSelectAllChanged"/>

<ListView x:Name="checkedListView" SelectionMode="Multiple" ItemsSource="{Binding CollectionOfDays}" DataContext="{Binding}"
ItemTemplate="{StaticResource ItemDataTemplate}" SelectedValue="WorkingDay"
CheckBox.Unchecked="OnUncheckItem" SelectionChanged="SelectDays" SelectedItem="{Binding SelectedItems}">
</ListView>

</StackPanel>


Код в FormWeek.код XAML.cs



 private void SelectDays(object sender, SelectionChangedEventArgs e)
{
(this.DataContext as TaskExecDefinitionViewModel).OnCheckBoxCommand(checkedListView.SelectedItems,true);

}


Мой Взгляд Модель TaskWeek.cs следующим образом



//декларация



private RelayCommand<object> _checkBoxCommand;

public ObservableCollection<string> CollectionOfDays { get; set; }
public ObservableCollection<string> SelectedItems { get; set; }

public RelayCommand<object> CheckBoxCommand
{
get
{
if (_checkBoxCommand == null)
{
_checkBoxCommand = new RelayCommand<object>((args) => OnCheckBoxCommand(args,true));
// _checkBoxCommand = new RelayCommand(() => OnCheckBoxCommand(object args));
}
return _checkBoxCommand;
}
}


//конструктор



CollectionOfDays = new ObservableCollection<string>();


/ / метод



private void GetWeekDays()
{
try
{
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{

CollectionOfDays.Add("Saturday");
CollectionOfDays.Add("Sunday");
CollectionOfDays.Add("Monday");
CollectionOfDays.Add("Tuesday");
CollectionOfDays.Add("Wednesday");
CollectionOfDays.Add("Thursday");
CollectionOfDays.Add("Friday");
}));
}
catch(Exception Ex)
{
MessageBox.Show(Ex.Message, "TaskWeek:GetWeekDays");
}
}

public void OnCheckBoxCommand(object obj, bool _direction)
{
try
{

if (SelectedItems == null)
SelectedItems = new ObservableCollection<string>();

if (obj != null)
{
SelectedItems.Clear();
StringBuilder items = new StringBuilder();


if (_direction)
{
foreach (string item in CollectionOfDays)
{

items.AppendFormat(item + ",");
}
}

MessageBox.Show(items.ToString());
}
else
SelectedItems.Clear();

}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "TaskDefinition:OnCheckBoxCommand");
}
}


А ниже находится кнопка click commond для сохранения данных.



<Button Grid.Column="2" Grid.Row="2" Content="Save" HorizontalAlignment="Center" VerticalAlignment="Bottom" 
Command="{Binding InsertExecDefCommand}" Margin="5" >


Теперь мое требование состоит в том, чтобы передать выбранные элементы listview просмотр модели через объект command. Я сделал это, используя следующий код в FormWeek.пример.cs через событие SelectionChanged как



private void OnSelectedItems(object sender, RoutedEventArgs e)
{
StringBuilder items = new StringBuilder();
foreach (string item in checkedListView.SelectedItems)
{
items.AppendFormat(item + ",");
}
string AllDays= items.ToString();
}


Но, пожалуйста, дайте мне знать, как достичь этой логики с помощью MVVM. Как получить selecteditems в моем представлении модель TaskWeek.cs

После R&D и google я сделал chages через RelayCommand. В методе OnCheckBoxCommand оператор foreach неверен, он проходит все дни. Я хочу передать только выбранный элемент listview. Пожалуйста, посоветуйте мне, что не так в Метод OnCheckBoxCommand.

809   2  

2 ответов:


Вот мои выводы:;
используйте этот код в коде позади FormWeek.xaml:


    private void SelectDays(object sender, SelectionChangedEventArgs e)
    {
    (this.DataContext as TaskExecDefinitionViewModel).OnCheckBoxCommand(checkedListView.SelectedItems,true);
    }

И в 'OnCheckBoxCommand': -

 public void OnCheckBoxCommand(object obj, bool _direction)
    {
        try
        {
            if (SelectedItems == null) SelectedItems = new ObservableCollection<string>();

            if (obj != null)
            {
              SelectedItems.Clear(); 
              var _list = ((IList)obj).Cast<string>().ToList();   
              if (_direction)
              {
                 _list.ForEach(item => SelectedItems.Add(item));
              }
            }
            else
             SelectedItems.Clear();                           
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "TaskDefinition:OnCheckBoxCommand");
        }
}

Хорошего тебе дня, парень.....продолжайте идти.

Привет попробуйте что-то вроде этого

   <StackPanel Grid.Column="1" Grid.Row="3" Margin="5">
    <CheckBox x:Name="selectAll" Content="Select all" Command="{Binding CheckBoxCommand}" CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Mode=Self}}"/>
    <ListView x:Name="checkedListView" SelectionMode="Extended"  ItemsSource="{Binding CollectionOfDays}" SelectedItem="{Binding SelectedItems}"/>
</StackPanel>

public class MainViewModel
{
    public MainViewModel()
    {
        CollectionOfDays = new ObservableCollection<string>();
        SelectedItems = new ObservableCollection<string>();

        CollectionOfDays.Add("Saturday");
        CollectionOfDays.Add("Sunday");
        CollectionOfDays.Add("Monday");
        CollectionOfDays.Add("Tuesday");
        CollectionOfDays.Add("Wednesday");
        CollectionOfDays.Add("Thursday");
        CollectionOfDays.Add("Friday");
    }

    private CommandHandler _checkBoxCommand;

    public CommandHandler CheckBoxCommand
    {
        get
        {
            return _checkBoxCommand ?? (_checkBoxCommand=new CommandHandler((param)=>OnCheckBoxCommand(param)));
        }
    }

    public ObservableCollection<string> CollectionOfDays { get; set; }

    public ObservableCollection<string> SelectedItems {get;set;}

    private void OnCheckBoxCommand(object obj)
    {

        if (obj is bool)
        {
            if (SelectedItems == null)
                SelectedItems = new ObservableCollection<string>();

            if ((bool)obj)
            {
                SelectedItems.Clear();
                foreach (var item in CollectionOfDays)
                {
                    SelectedItems.Add(item);
                }
            }
            else
                SelectedItems.Clear();
        }
    }

}

public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainViewModel();
    }
Я надеюсь, что это даст вам представление.

Comments

    Ничего не найдено.