获取ItemsControl中的选定项

34 浏览
0 Comments

获取ItemsControl中的选定项

我有以下代码,它以行和列的形式填充了我的用户控件。被填充的用户控件包含按钮、链接、文本框等等。当特定的按钮在特定的行/列上的特定用户控件上被按下时,我需要知道是哪个用户控件的按钮被按下了。这是用于在行和列中填充用户控件的XAML代码:

Templates基本上是一个用户控件的集合,它们被填充在行和列中。

最好的方法是在ViewModel中实现,但是暂时在代码后台实现也可以。

0
0 Comments

问题:如何在ItemsControl中获取选中的项?

原因:在ItemsControl中,没有内置的属性或事件来直接获取选中的项。需要通过其他方式来实现。

解决方法:可以使用ListView,并添加一个SelectionChanged事件。然后,实现一个函数来验证ListView.SelectedItem,就像在DataGrid中一样。

代码示例:


    

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var selectedItem = (sender as ListView).SelectedItem;
    // Handle the selected item
}

以上是解决在ItemsControl中获取选中项的方法。通过使用ListView和SelectionChanged事件,可以通过ListView.SelectedItem属性获取选中的项。

0
0 Comments

问题原因:这段代码的目的是实现在ItemsControl中获取选中项的功能。然而,问题的原因在于没有明确指定选中项的获取方式,导致无法正常获取选中项。

解决方法:通过添加一个行为(behavior)来实现获取选中项的功能。在这个行为中,定义了一个依赖属性BindingProperty,并在其属性改变时触发SelectedItme_Changed方法。通过设置该依赖属性,将选中项与Toggle Button的DataContext绑定起来。同时,在Toggle Button的Checked事件中调用ToggleButtonOnChecked方法,将选中项绑定到Toggle Button上。最后,在ItemsControl的ItemTemplate中使用RadioButton,并将SelectedItemBehavior.Binding属性绑定到ItemsControl的DataContext.SelectedValue上,实现选中项的获取。

以下是整理后的文章:

我为你提供了一种解决方案...一种行为(behavior):

public static class SelectedItemBehavior

{

public static readonly DependencyProperty BindingProperty =

DependencyProperty.RegisterAttached("Binding", typeof(object), typeof(SelectedItemBehavior),

new FrameworkPropertyMetadata(new object(),

FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,

SelectedItem_Changed));

public static object GetBinding(FrameworkElement frameworkElement)

{

return (object)frameworkElement.GetValue(BindingProperty);

}

public static void SetBinding(FrameworkElement frameworkElement, object value)

{

frameworkElement.SetValue(BindingProperty, value);

}

private static void SelectedItem_Changed(Object sender, DependencyPropertyChangedEventArgs e)

{

ToggleButton toggleButton = (ToggleButton)sender;

toggleButton.Checked -= ToggleButtonOnChecked;

toggleButton.IsChecked = e.NewValue?.Equals(toggleButton.DataContext) ?? false;

toggleButton.Checked += ToggleButtonOnChecked;

}

private static void ToggleButtonOnChecked(object sender, RoutedEventArgs e)

{

ToggleButton toggleButton = (ToggleButton)sender;

SetBinding(toggleButton, toggleButton.DataContext);

}

}

然后按照以下方式进行绑定:

<ItemsControl

Name="ItemsControlList"

Width="200"

Height="100"

ItemsSource="{Binding Values}">

<ItemsControl.ItemTemplate>

<DataTemplate>

<RadioButton local:SelectedItemBehavior.Binding="{Binding ElementName=ItemsControlList, Path=DataContext.SelectedValue}" Content="{Binding}" />

</DataTemplate>

</ItemsControl.ItemTemplate>

</ItemsControl>

0
0 Comments

问题的原因是ItemsControl不能选择项目,它只能呈现集合。只有Selector或其子类才能选择项目。解决方法是使用ListView和GridView。当用户点击行中的控件时,事件会冒泡到ListView,然后项目会被选中。可以重写默认样式,以便不显示选中行。可以参考WPF ListView turn off selection来了解如何关闭选择功能。

0