Member 11859517 Ответов: 2

Проверено и снято все элементы listview на основе 1-го элемента listview.


Привет,

У меня есть сценарий типа ListView с флажками, 1-й вариант будет "выбрать все" на 1-м элементе установлен флажок я должен проверить все элементы в списке, а на 1-м элементе снят флажок я должен снять все элементы. и если предположим, что выбраны все элементы, и я снял галочку с любого другого, кроме 1-го(2-го, 3-го), то 1-й элемент должен быть снят.

Что я уже пробовал:

<Window.Resources>
        <ControlTemplate x:Key="ItemTemplate" TargetType="ListViewItem">
            <Border
		BorderThickness="{TemplateBinding Border.BorderThickness}"
		Padding="{TemplateBinding Control.Padding}"
		BorderBrush="{TemplateBinding Border.BorderBrush}"
		Background="{TemplateBinding Panel.Background}"
		SnapsToDevicePixels="True">
                <ContentPresenter
			Content="{TemplateBinding ContentControl.Content}"
			ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
			HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
			VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
			SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
            </Border>
        </ControlTemplate>

        <Style TargetType="ListViewItem">
            <Setter Property="Template" Value="{StaticResource ItemTemplate}" />
        </Style>

        <DataTemplate x:Key="ItemDataTemplate">
            <CheckBox
			x:Name="checkbox"
			Content="{Binding}"
			IsChecked="{Binding	RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <ListView
			x:Name="checkedListView"
			SelectionMode="Multiple"
			ItemsSource="{Binding}"
			ItemTemplate="{StaticResource ItemDataTemplate}"
			CheckBox.Unchecked="OnUncheckItem" 
            CheckBox.Checked="checkedListView_Checked"/>
        </StackPanel>
    </Grid>

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            ObservableCollection<string> items = new ObservableCollection<string>();
            items.Add("Item 1");
            items.Add("Item 2");
            items.Add("Item 3");
            items.Add("Item 4");
            items.Add("Item 5");
            DataContext = items;
            
        }

        private void OnUncheckItem(object sender, RoutedEventArgs e)
        {
            //How to do ????;
        }
        int count = 0;
        private void checkedListView_Checked(object sender, RoutedEventArgs e)
        {
            //Somthing i tried
            //count bcoz of collection not allow me to modify.
            string str = checkedListView.SelectedItem.ToString();
            if (str == "Item 1" && count == 0)
            {
                count++;
                checkedListView.SelectAll();
            }
        }
    }

Плз, может ли кто-нибудь помочь, как это сделать?

Спасибо.

2 Ответов

Рейтинг:
1

Veer &lt;3

Если я правильно понимаю, вам нужен флажок select all в вашем listview.

Ниже приведен шаблон и код для того же самого.

<Grid>
		<ListView x:Name="lv">
			<ListView.View>
				<GridView x:Name="gv">
					<GridViewColumn x:Name="gridClm_SelectRow" Width="35">
						<GridViewColumn.CellTemplate>
							<DataTemplate>
								<CheckBox Name="cbSelectRow" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor,
                                         AncestorType={x:Type ListViewItem}}, Path=IsSelected}"
										  HorizontalContentAlignment="Center"  HorizontalAlignment="Center"
										  VerticalAlignment="Center" Checked="chkWspSelect_Checked"  Unchecked="chkWspSelect_Unchecked"  IsThreeState="False"/>
								 </DataTemplate>
						</GridViewColumn.CellTemplate>
						<CheckBox Margin="0" x:Name="chkSelectAll" Click="chkSelectAll_Click"/>
					</GridViewColumn>
					<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}" ></GridViewColumn>
				</GridView>
			</ListView.View>
		</ListView>
	</Grid> 

 public partial class MainWindow : Window
	{
		public ObservableCollection<MyEmployeeClass> EmployeeList { get; set; }
		public MainWindow()
		{
			InitializeComponent();
			EmployeeList = new ObservableCollection<MyEmployeeClass>();
			EmployeeList.Add(new MyEmployeeClass("Parth1"));
			EmployeeList.Add(new MyEmployeeClass("Parth2"));
			EmployeeList.Add(new MyEmployeeClass("Parth3"));
			EmployeeList.Add(new MyEmployeeClass("Parth4"));
			EmployeeList.Add(new MyEmployeeClass("Parth5"));
			EmployeeList.Add(new MyEmployeeClass("Parth6"));
			EmployeeList.Add(new MyEmployeeClass("Parth7"));
			lv.ItemsSource = EmployeeList;
		}

		private void chkSelectAll_Click(object sender, RoutedEventArgs e)
		{
			if (chkSelectAll.IsChecked.Value == true)
			{
				lv.SelectAll();
			}
			else
			{
				lv.UnselectAll();
			}
		}

		private void chkWspSelect_Checked(object sender, RoutedEventArgs e)
		{
			ListBoxItem item = ItemsControl.ContainerFromElement(lv, e.OriginalSource as DependencyObject) as ListBoxItem;
			if (item != null)
			{
				item.IsSelected = true;
			}
		}

		private static bool individualChkBxUnCheckedFlag { get; set; }
		private void chkWspSelect_Unchecked(object sender, RoutedEventArgs e)
		{
			ListBoxItem item = ItemsControl.ContainerFromElement(lv, e.OriginalSource as DependencyObject) as ListBoxItem;
			if (item != null)
				item.IsSelected = false;

			individualChkBxUnCheckedFlag = true;
			CheckBox headerChk = (CheckBox)((GridView)lv.View).Columns[0].Header;
			headerChk.IsChecked = false;
		}

	}

		public class MyEmployeeClass
		{
			public string Name { get; set; }
			public MyEmployeeClass(string name)
			{
				Name = name;
			}
		} 


PS : вы можете переместить методы в коде позади ViewModel в случае MVVM :)


Member 11859517

Эй, Спасибо за ответ, он работает, но вы используете столбец listview и один дополнительный флажок, но я этого не хочу, посмотрите, что я разместил код, как я хочу мольбы, можете ли вы сказать, как я могу это сделать,

Рейтинг:
1

Veer &lt;3

значит, первый пункт вашего списка будет служить опцией select all ?
Если нет, то вам нужен дополнительный столбец для предоставления опции select All.

В случае, если вам нужен первый элемент списка, чтобы действовать как Select All, вы должны пойти на иерархический шаблон данных, а не на представление списка. Это даст вам желаемый результат.


Надеюсь, это поможет.

PS дайте мне знать, если вам понадобится помощь с этим. и если это решит его, не забудьте отметить выше как решение ;)