我有以下代码,它以行和列的形式填充我的用户控件。正在填充的用户控件包含按钮,链接,文本框等。当在特定行/列中的特定用户控件上按下某个按钮时,我需要知道该按钮被按下了哪个用户控件。以下是在行和列中填充用户控件的XAML
<ItemsControl ItemsSource="{Binding Templates}" Width="{Binding GridWidth}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="{Binding NumColumns}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Grid.Column" Value="{Binding ColumnIndex}" />
<Setter Property="Grid.Row" Value="{Binding RowIndex}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
</ItemsControl>
模板基本上是在行/列中填充的UserControl的集合。 我希望在ViewModel中执行此操作,但现在代码中的解决方案也可以正常工作。
答案 0 :(得分:19)
ItemsControl
无法选择项目,只能显示收藏品。只有Selector或其中一个后代可以选择项目。
对于您的方案,我认为ListView GridView适合您。当用户单击该行中的控件时,该事件将冒泡到ListView
并且该项目将被选中。您可以覆盖默认样式,使其不会显示为选定行:WPF ListView turn off selection。
答案 1 :(得分:-1)
我有一个解决方案……一种行为:
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>