当我按下要检查的项目中的按钮以删除该项目时,如何自动 select 正确的 ListBox 项目?
How can I select the right ListBox Item automatically when I press the Button in the Item I want to Check to delete this Item?
所以我在 WPF 中得到了一个 ListBox,我通过 DataTemplate 在我的 ListBoxItem 中得到了一个按钮。我正在将这样的按钮添加到我的项目中:
<ListBox Grid.Column="1" BorderBrush="Black" Margin="15,20,10,15" MinHeight="25" Name="tbxFiles"
VerticalAlignment="Stretch"
ItemsSource="{Binding Items}"
SelectionMode="Multiple">
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="OverridesDefaultStyle" Value="true" />
<Setter Property="SnapsToDevicePixels" Value="true" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="ListText" Text="{Binding}" Grid.Column="0"/>
<RadioButton Grid.Column="1" Content="TF" />
<RadioButton Grid.Column="2" Content="AF" />
<ComboBox Grid.Column="3" Text="Periode" />
<Button Grid.Column="4" Click="RemoveMark_Click" Content="Delete" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Resources>
</ListBox>
现在要创建的每个 ListBox 项目都有一个 deleteButton,当我按下此按钮时,此代码将开始删除此项目:
PeriodeCombo.Items.Clear();
string required = tbxFiles.SelectedItems.Cast<string>().Aggregate((a, b) => a + b);
required = tbxFiles.SelectedItems.Cast<string>().Distinct()
.Aggregate((a, b) => a + b);
required = tbxFiles.SelectedItems.Cast<string>().Distinct()
.Aggregate((a, b) => a + ";" + b);
string[] words = required.Split(';');
foreach (var word in words)
{
temp1.Add(word);
}
for (int i = 0; i < temp1.Count; i++)
{
path.Remove(temp1[i]);
}
path.Remove(required);
tbxFiles.Items.Remove(tbxFiles.SelectedItem);
while (tbxFiles.SelectedItems.Count > 0)
{
tbxFiles.Items.Remove(tbxFiles.SelectedItems[0]);
}
并且此代码仅删除我单击并选中的这些项目。但是我现在想做的是,我可以通过单击项目所在的删除按钮来删除项目而无需选择。因此,当我单击删除按钮时,无需单击该项目,该项目就会被删除。我是如何下跪更改我的代码以使其正常工作的?
在 RemoveMark_Click
中,第一个参数(通常称为 sender
并且类型为 object
)应该由您单击的 Button
提供,并且它的 DataContext 应该是您的集合要删除的项目。
所以将 RemoveMark_Click 更改为:
void RemoveMark_Click(object sender, RoutedEventArg args)
{
//TODO add null checks a/o exception handling
var uiElement = (Button)sender;
var dataItem = uiElement.DataContext;
tbxFiles.Items.Remove(dataItem);
}
一般来说,对于按钮,使用 Command 来执行所需的操作是更常见和好的做法,因为这样您就可以在 ViewModel 中施展魔法。
此外,为了设置数据模板 a/o 列表框项的特殊布局,列表框的项容器样式通常就足够了,您不需要 覆盖控件模板,但你当然可以,而且它会起作用。
所以我在 WPF 中得到了一个 ListBox,我通过 DataTemplate 在我的 ListBoxItem 中得到了一个按钮。我正在将这样的按钮添加到我的项目中:
<ListBox Grid.Column="1" BorderBrush="Black" Margin="15,20,10,15" MinHeight="25" Name="tbxFiles"
VerticalAlignment="Stretch"
ItemsSource="{Binding Items}"
SelectionMode="Multiple">
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="OverridesDefaultStyle" Value="true" />
<Setter Property="SnapsToDevicePixels" Value="true" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="ListText" Text="{Binding}" Grid.Column="0"/>
<RadioButton Grid.Column="1" Content="TF" />
<RadioButton Grid.Column="2" Content="AF" />
<ComboBox Grid.Column="3" Text="Periode" />
<Button Grid.Column="4" Click="RemoveMark_Click" Content="Delete" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Resources>
</ListBox>
现在要创建的每个 ListBox 项目都有一个 deleteButton,当我按下此按钮时,此代码将开始删除此项目:
PeriodeCombo.Items.Clear();
string required = tbxFiles.SelectedItems.Cast<string>().Aggregate((a, b) => a + b);
required = tbxFiles.SelectedItems.Cast<string>().Distinct()
.Aggregate((a, b) => a + b);
required = tbxFiles.SelectedItems.Cast<string>().Distinct()
.Aggregate((a, b) => a + ";" + b);
string[] words = required.Split(';');
foreach (var word in words)
{
temp1.Add(word);
}
for (int i = 0; i < temp1.Count; i++)
{
path.Remove(temp1[i]);
}
path.Remove(required);
tbxFiles.Items.Remove(tbxFiles.SelectedItem);
while (tbxFiles.SelectedItems.Count > 0)
{
tbxFiles.Items.Remove(tbxFiles.SelectedItems[0]);
}
并且此代码仅删除我单击并选中的这些项目。但是我现在想做的是,我可以通过单击项目所在的删除按钮来删除项目而无需选择。因此,当我单击删除按钮时,无需单击该项目,该项目就会被删除。我是如何下跪更改我的代码以使其正常工作的?
在 RemoveMark_Click
中,第一个参数(通常称为 sender
并且类型为 object
)应该由您单击的 Button
提供,并且它的 DataContext 应该是您的集合要删除的项目。
所以将 RemoveMark_Click 更改为:
void RemoveMark_Click(object sender, RoutedEventArg args)
{
//TODO add null checks a/o exception handling
var uiElement = (Button)sender;
var dataItem = uiElement.DataContext;
tbxFiles.Items.Remove(dataItem);
}
一般来说,对于按钮,使用 Command 来执行所需的操作是更常见和好的做法,因为这样您就可以在 ViewModel 中施展魔法。 此外,为了设置数据模板 a/o 列表框项的特殊布局,列表框的项容器样式通常就足够了,您不需要 覆盖控件模板,但你当然可以,而且它会起作用。