mayho33
Goto Top

C-Sharp WPF XAML CheckBox.IsEnabled wenn ListViewItem.Select

Hallo @ All!

Weil ich mich hier eventuell etwas falsch/zu kompliziert ausgedrückt habe, wiederhole ich meine Bitte um Hilfe nochmal in geänderter Form

Ich habe eine ListView mit 3 Columns
  • CheckBox (wenn aktiviert dann den gesamten Ordner kopieren in dem sich das File befindet)
  • Name (FileNames)
  • Root (Pfad zu den Files, kann mehrmals vorkommen)

Die Liste wird via Pfad aus FolderBrowserDialog() befüllt. dazu nutze ich ein Binding auf eine ObservableCollection<Class>()
//MODEL
public class ListViewProperties_Model
        {
            public bool WholeFolder { get; set; }
            public string Name { get; set; }
            public string Root { get; set; }
            public string FilePath { get; set; }
        }

private static string _Prerequisites_FolderPath;
        public string Prerequisites_FolderPath
        {
            get { return _Prerequisites_FolderPath; }
            set
            {
                if (_Prerequisites_FolderPath == value)
                    return;

                _Prerequisites_FolderPath = value;
                RaisePropertyChanged("Prerequisites_FolderPath");  
                LoadPrerequisites(Prerequisites_FolderPath).ToList();
            }
        }

private ObservableCollection<ListViewProperties_Model> _PrereqList_All;
        public ObservableCollection<ListViewProperties_Model> PrereqList_All
        {
            get
            {
                return _PrereqList_All;
            }
            set
            {
                if (value != _PrereqList_All)
                {
                    _PrereqList_All = value;
                    foreach (var item in value)
                    {
                        MainWindow.Selected_PrerequisitesItems.Add((WizzardPrerequisites.ListViewProperties_Model)item);
                    }
                    RaisePropertyChanged("PrereqList_All");  
                }
                
            }
        }

//VIEWMODEL
public ObservableCollection<ListViewProperties_Model> LoadPrerequisites(string folderPath)
        {
            List<string> files                                  = new List<string>();
            string filesTMP                                   = null;
            FileInfo info                                       = null;
            PrereqList_All = new ObservableCollection<ListViewProperties_Model>();
            foreach (var pattern in MainWindow.ListsViewSelectionPattern)
            {
                try
                {
                    filesTMP = Directory.GetFiles(folderPath, pattern, SearchOption.AllDirectories);
                }
                catch { }

                try
                {
                    foreach (var file in filesTMP)
                        files.Add(file);
                }
                catch { }
            }
            
            try
            {
                foreach (var file in files)
                {
                    info        = new FileInfo(file);
                    string name = info.Name;
                    string path = info.FullName.Replace(new WizzardPrerequisites().Prerequisites_FolderPath, @"\..").Replace(name, "");  
                    PrereqList_All.Add(new ListViewProperties_Model
                    {
                        Name        = name,
                        Root        = path,
                        FilePath    = info.FullName
                    });
                }
            }
            catch (Exception e) { MessageBox.Show(e.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); }  
            return PrereqList_All;
        }

//VIEW

<UserControl x:Class= usw. usw.
<TextBox
            x:Name="textBox_Path"  
            Width="539"  
            Height="22"  
            Margin="54,184,0,0"  
            HorizontalAlignment="Left"  
            VerticalAlignment="Top"  
            Text="{Binding Path=Prerequisites_FolderPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  
            TextWrapping="Wrap" />  

<ListView
            ItemsSource="{Binding PrereqList_All, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"  
            SelectionChanged="ListView_PrereqFiles_SelectionChanged"  
            x:Name="listView_PrereqFiles"  
            Height="330"  
            Margin="54,212,50,0"  
            VerticalAlignment="Top"  
            AllowDrop="True"  
            AutomationProperties.IsColumnHeader="True"  
            SelectionMode="Multiple">  
            <ListView.View>
                <!--ListView ToolTip
                see here:
                http://stackoverflow.com/questions/11155077/how-to-add-tooltip-text-on-my-gridview-column-header-wpf-vs2010
                -->
                <GridView>
                    <GridViewColumn 
                        Width="auto"  
                        HeaderContainerStyle ="{StaticResource GridViewHeaderAllingnment}" >  
                        <GridViewColumn.Header>
                            <TextBlock Text="Ordner mitnehmen"  
                                       ToolTip="Wenn die Checkbox aktiviert wird, weisen sie den Wizzard an,&#xA;den gesamten Ordner zu kopieren in dem sich die Setup-Datei befindet.">  
                            </TextBlock>
                        </GridViewColumn.Header>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox 
                                    Tag="{Binding WholeFolder}"  
                                    HorizontalAlignment="Center"   
                                    IsChecked="{Binding WholeFolder}"   
                                    IsEnabled="False">  
                                </CheckBox>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn 
                        Width="220"  
                        HeaderContainerStyle ="{StaticResource GridViewHeaderAllingnment}"   
                        DisplayMemberBinding="{Binding Name}"   
                        Header="Name"  
                    </GridViewColumn>

                    <GridViewColumn 
                        Width="220"  
                        HeaderContainerStyle ="{StaticResource GridViewHeaderAllingnment}"   
                        DisplayMemberBinding="{Binding Root}"  
                        Header="Root">  
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
/>

Das funktioniert perfekt.

die SelectedItems hole ich so und speichere sie in einer static List<Class>() zwischen für spätere Weiterverarbeitung:
private void ListView_PrereqFiles_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var sel = this.listView_PrereqFiles.SelectedItems;
            MainWindow.Selected_PrerequisitesItems.Clear();
            foreach (var item in sel)
            {
                MainWindow.Selected_PrerequisitesItems.Add((WizzardPrerequisites.ListViewProperties_Model)item);
            }
        }


Mein Problem:

Die Checkboxen sind initial auf IsEnabled = "False" gestellt. Ich möchte nun realisieren, dass CheckBox.IsEnabled="True" ist, sobald ein Item "selected" ist. Habe aber keine Ahnung wie ich das bewerkstelligen kann.

Meine bisherigen Versuche mit SelectionChanched-Events sind kläglich gescheitert, weil ich weder die Checkbox selbst noch ihren Status finden/abfragen kann.
Kann mir da jemand von euch mit Tipps zur Hand gehen? Für kleine Beispiele wäre ich dankbar!

Grüße!

mayho

Content-Key: 326408

Url: https://administrator.de/contentid/326408

Ausgedruckt am: 19.03.2024 um 07:03 Uhr

Mitglied: colinardo
Lösung colinardo 15.01.2017 aktualisiert um 14:43:38 Uhr
Goto Top
Servus @mayho,
mach dir doch in deinem Objekt noch ein zusätzliches Feld für IsEnabled und binde die Checkbox IsEnabled Eigenschaft daran.

Beispiel:
WPF_ListViewTest_326408.exe

back-to-topXAML-Code
<Window x:Class="ListViewTest.MainWindow"  
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
        xmlns:local="clr-namespace:ListViewTest"  
        mc:Ignorable="d"  
        Title="MainWindow" Height="290" Width="300.833" Loaded="Window_Loaded">  
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListView x:Name="listView" Margin="10" SelectionChanged="listView_SelectionChanged" ItemsSource="{Binding Path=myrowitem}">  
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Checkbox" Width="auto">  
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox HorizontalAlignment="Center" IsEnabled="{Binding Path=checkbox_enabled}" />  
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="100" Header="Name" DisplayMemberBinding="{Binding Path=name}"/>  
                    <GridViewColumn Width="100" Header="Root" DisplayMemberBinding="{Binding Path=root}"/>  
                </GridView>
            </ListView.View>
        </ListView>

    </Grid>
</Window>

back-to-topCode-Behind
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace ListViewTest {
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
            DataContext = new mylistviewmodel();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e) {
            for (int i = 1;i <= 10; i++) {
                listView.Items.Add(new myrowitem {checkbox_enabled = false, name = "Name_" + i, root = "Pfad_" + i});  
            }
        }

        private void listView_SelectionChanged(object sender, SelectionChangedEventArgs e) {
            foreach (myrowitem itm in e.RemovedItems)
                itm.checkbox_enabled = false;

            foreach (myrowitem itm in e.AddedItems)
                itm.checkbox_enabled = true;
        }
    }

    public class myrowitem : INotifyPropertyChanged {
        private bool _checkbox_enabled;
        private string _name;
        private string _root;

        public bool checkbox
        {
            get{return _checkbox_enabled;}
            set
            {
                _checkbox_enabled = value;
                NotifyPropertyChanged("checkbox_enabled");  
            }
        }

        public string name
        {
            get{ return _name;}

            set
            {
                _name = value;
                NotifyPropertyChanged("name");  
            }
        }

        public string root
        {
            get{return _root;}

            set
            {
                _root = value;
                NotifyPropertyChanged("root");  
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName) {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

    }

    internal class mylistviewmodel {
        public ObservableCollection<myrowitem> ListViewItems = new ObservableCollection<myrowitem>();
       
    }
}
Grüße Uwe
Mitglied: mayho33
mayho33 15.01.2017 um 18:35:07 Uhr
Goto Top
Servus @uwe!

Perfekt!! Danke! Hat nach dem Umbau auf Anhieb funktioniert und liefert genau das was ich brauche. face-smile

Verneige mich!!

Beste Grüße!

Chris
Mitglied: colinardo
Lösung colinardo 15.01.2017 um 20:01:07 Uhr
Goto Top
Gerne, keine Ursache face-smile

Schönen Abend.