C # WPF Связывание двух списков на TabControl - PullRequest
0 голосов
/ 04 мая 2018

Я хотел бы иметь TabControl с двумя TabItems и одним Listbox на каждый предмет. Я хочу, чтобы оба ListBoxes показывали один и тот же контент, поэтому я привязал оба к одному и тому же ObservableCollection<T>. Сначала элементы отображаются правильно в Listbox1. Также, если я переключусь на ListBox2, здесь также появятся элементы. Если я вернусь к Listbox1, то все предметы исчезнут и останутся в ListBox2. Я хочу, чтобы оба ListBoxes держали и постоянно показывали один и тот же ListBoxItems. Действительно был бы признателен за некоторую помощь!

Мой код XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="350*"/>
        <RowDefinition Height="100*"/>
    </Grid.RowDefinitions>
    <Button Grid.Row="1" Margin="5,5,5,5" Content="Add" Click="Button_Click"/>
    <TabControl Grid.Row="0">
        <TabItem Header="Test1">
            <ListBox ItemsSource="{Binding Components}"/>
        </TabItem>
        <TabItem Header="Test2">
            <ListBox ItemsSource="{Binding Components}"/>
        </TabItem>
    </TabControl>
</Grid>

Код CS:

        private ListBoxItem _oBoxItem;
        private Int32 i = 0;
        private ObservableCollection<ListBoxItem> components = new ObservableCollection<ListBoxItem>();
        public ObservableCollection<ListBoxItem> Components
        {
            get
            {
                if (components == null)
                    components = new ObservableCollection<ListBoxItem>();
                return components;
            }
        }
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            _oBoxItem = new ListBoxItem();
            _oBoxItem.Content = "Part " + i.ToString();
            Components.Add(_oBoxItem);
            i += 1;
        }

1 Ответ

0 голосов
/ 04 мая 2018

Не добавляйте визуальные элементы, такие как ListBoxItem, в исходную коллекцию. Вместо этого добавьте strings, и вы получите ожидаемые результаты:

public partial class MainWindow : Window
{
    private Int32 i = 0;
    private ObservableCollection<string> components = new ObservableCollection<string>();
    public ObservableCollection<string> Components
    {
        get
        {
            if (components == null)
                components = new ObservableCollection<string>();
            return components;
        }
    }
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Components.Add("Part " + i.ToString());
        i += 1;
    }
}

Визуальный элемент может появляться только один раз в визуальном дереве. В основном это означает, что ListBoxItem, который вы добавляете к первому ListBox, не может отображаться во втором ListBox и наоборот.

...