Выбор элемента WPF из пользовательского элемента управления ListView - PullRequest
0 голосов
/ 18 июня 2020

Я создал пользовательский элемент управления с возможностью привязки 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

    }

...