Элементы ComboBox не обновляются при добавлении списка в источник элементов - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть ComboBox, связанный с List<class> с несколькими значениями для категорий.

Я отображаю элементы с Binding Path="Name" и использую INotifyPropertyChanged.

Когда я Insert()элементов в List<Example> Example_Items в ViewModel, List обновляется элементами, вставленными в правильный индекс, но ComboBox не обновляет отображение.


ComboBox

<ComboBox x:Name="cboExample" 
          ItemsSource="{Binding Example_Items, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          SelectedIndex="{Binding Example_SelectedIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          SelectedValue="{Binding Example_SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          SelectedValuePath="Name"
          Style="{DynamicResource ComboBoxCategoryStyle}"
          ItemContainerStyle="{DynamicResource ComboBoxCategoryStyleItem}" 
          HorizontalAlignment="Left"
          VerticalAlignment="Top" 
          Width="75" 
          Height="22"
          Margin="56,0,0,0"
          SelectionChanged="cboExample_SelectionChanged" 
          >
    <ComboBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Margin="0 -7 0 0"/>
        </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Grid Width="93">
                <TextBlock DataContext="{Binding}">
                    <TextBlock.Text>
                        <Binding Path="Name"/>
                    </TextBlock.Text>
                </TextBlock>
            </Grid>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

ViewModel

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    private void OnPropertyChanged(string prop)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(prop));
        }
    }

    ...   



// Items Source
public class Example
{
    public string Name { get; set; }
    public bool Category { get; set; }
}

public List<Example> _Example_Items = new List<Example>()
{
    new Example() { Name = "Category 1",  Category = true  },
    new Example() { Name = "Item 1",      Category = false },
    new Example() { Name = "Item 2",      Category = false },

    new Example() { Name = "Category 2",  Category = true  },
    new Example() { Name = "Item 3",      Category = false },
    new Example() { Name = "Item 4",      Category = false },
};

public List<Example> Example_Items
{
    get { return _Example_Items; }
    set
    {
        _Example_Items = value;
        OnPropertyChanged("Example_Items");
    }
}

Изменить источник элементов ComboBox

// New Items
List<string> newItemsList = new List<string>() 
{
    "New Item 5",
    "New Item 6",
    "New Item 7",
}

// Add New Items to Example Items Source
for (var i = 0; i < newItemsList.Count; i++)
{
    vm.Example_Items.Insert(5, new ViewModel.Example() { Name = newItemsList[i], Category = false });
}

1 Ответ

2 голосов
/ 03 апреля 2019

Для обновления пользовательского интерфейса после изменений коллекции вы должны использовать ObservableCollection, его реализации INotifyCollectionChanged, которые уведомляют слушателей об изменениях коллекции. OnPropertyChanged("Example_Items"); в вашем случае уведомляет об изменении самого List, а не о его содержимом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...