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
Die Liste wird via Pfad aus FolderBrowserDialog() befüllt. dazu nutze ich ein Binding auf eine ObservableCollection<Class>()
Das funktioniert perfekt.
die SelectedItems hole ich so und speichere sie in einer static List<Class>() zwischen für spätere Weiterverarbeitung:
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
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,
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 326408
Url: https://administrator.de/forum/c-sharp-wpf-xaml-checkbox-isenabled-wenn-listviewitem-select-326408.html
Ausgedruckt am: 06.04.2025 um 00:04 Uhr
3 Kommentare
Neuester Kommentar
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
Grüße Uwe
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
XAML-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>
Code-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>();
}
}