Я создал пользовательский элемент управления с возможностью привязки ListView в нем. Я связываю источник элемента и выбранный элемент этого элемента управления, и он работает, как ожидалось, когда я использую его один раз в представлении. Однако, когда я пытаюсь повторно использовать один и тот же пользовательский элемент управления с другим источником элемента и выбранным элементом, выбор элемента перестает работать - когда я выбираю элемент из одного элемента ListView из другого ListView, становится невыбранным.
Я привязываю свой ListView следующим образом:
<ListView
x:Name="SelectionListView"
Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"
ItemsSource="{Binding ElementName=SelectionListControl, Path=Items}"
Background="Transparent" SelectedItem="{Binding ElementName=SelectionListControl, Path=SelectedItem}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="6"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<controls:RadioButtonConfig Content="{Binding Text}"
Template="{StaticResource RadioButtonConfig}"
GroupName="DisplayPage"
IsChecked="{Binding IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}"
IsConfigured="{Binding IsConfigured}"/>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
</ListView>
Я добавил свой код в github Проект ListViewBinding .
Изменить: управляющий код ListView позади:
public partial class SelectionList : UserControl
{
public List<SelectionListItem> Items
{
get { return (List<SelectionListItem>)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items", typeof(List<SelectionListItem>), typeof(SelectionList), new PropertyMetadata(new List<SelectionListItem>()));
public SelectionListItem SelectedItem
{
get { return (SelectionListItem)GetValue(SelectedItemProperty); }
set { SetValue(SelectedItemProperty, value); }
}
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.Register("SelectedItem", typeof(SelectionListItem), typeof(SelectionList), new FrameworkPropertyMetadata(new SelectionListItem(), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public SelectionList()
{
InitializeComponent();
}
}
Модель элемента ListView ( SetProperty вызывает событие INotifyPropertyChanged PropertyChanged):
public class SelectionListItem: ObservableObject
{
private string text;
public string Text
{
get { return text; }
set { SetProperty(ref text, value); }
}
private object valueObj;
public object ValueObj
{
get { return valueObj; }
set { valueObj = value; }
}
private bool isConfigured;
public bool IsConfigured
{
get { return isConfigured; }
set { SetProperty(ref isConfigured, value); }
}
}
Я использую свои элементы управления в MainWindow:
<StackPanel Grid.Row="0">
<local:SelectionList
x:Name="List1"
Items="{Binding SelectableItems}"
SelectedItem="{Binding SelectedItem}"/>
<TextBlock >
<Run Text="Selected Item: "/>
<Run Text="{Binding SelectedItem.Text, FallbackValue=SelectedItem}"/>
</TextBlock>
<TextBlock>
<Run Text="Configured Item: "/>
<Run Text="{Binding ConfiguredItem.Text, FallbackValue=ConfiguredItem}"/>
</TextBlock>
</StackPanel>
<StackPanel Grid.Row="1">
<local:SelectionList
x:Name="List2"
Items="{Binding SelectableItems2}"
SelectedItem="{Binding SelectedItem2}"/>
<TextBlock >
<Run Text="Selected Item: "/>
<Run Text="{Binding SelectedItem2.Text, FallbackValue=SelectedItem}"/>
</TextBlock>
<TextBlock>
<Run Text="Configured Item: "/>
<Run Text="{Binding ConfiguredItem2.Text, FallbackValue=ConfiguredItem}"/>
</TextBlock>
</StackPanel>
С данными, привязанными из MainWindowViewModel:
public class MainWindowViewModel : ObservableObject
{
#region list1
private List<SelectionListItem> selectableItems = new List<SelectionListItem>();
public List<SelectionListItem> SelectableItems
{
get { return selectableItems; }
set
{
SelectedItem = value[0];
SetProperty(ref selectableItems, value);
}
}
private SelectionListItem selectedItem = new SelectionListItem { Text = "-", IsConfigured = false };
public SelectionListItem SelectedItem
{
get { return selectedItem; }
set { SetProperty(ref selectedItem, value); }
}
private SelectionListItem configuredItem = new SelectionListItem { Text = "-", IsConfigured = false };
public SelectionListItem ConfiguredItem
{
get { return configuredItem; }
set { SetProperty(ref configuredItem, value); }
}
private string valueText;
public string ValueText
{
get { return valueText; }
set { SetProperty(ref valueText, value); }
}
#endregion
#region list1
private List<SelectionListItem> selectableItems2 = new List<SelectionListItem>();
public List<SelectionListItem> SelectableItems2
{
get { return selectableItems2; }
set
{
SelectedItem2 = value[0];
SetProperty(ref selectableItems2, value);
}
}
private SelectionListItem selectedItem2 = new SelectionListItem { Text = "-", IsConfigured = false };
public SelectionListItem SelectedItem2
{
get { return selectedItem2; }
set { SetProperty(ref selectedItem2, value); }
}
private SelectionListItem configuredItem2 = new SelectionListItem { Text = "-", IsConfigured = false };
public SelectionListItem ConfiguredItem2
{
get { return configuredItem2; }
set { SetProperty(ref configuredItem2, value); }
}
private string valueText2;
public string ValueText2
{
get { return valueText2; }
set { SetProperty(ref valueText2, value); }
}
#endregion
}