SourceUpdated с NotifyOnSourceUpdated не запускается в ListBox - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь использовать событие SourceUpdated в ListBox, но оно не срабатывает. Я связал ObservableCollection с ItemSource ListBox, установил NotifyOnSourceUpdated = true, и привязка работает правильно - после добавления нового элемента в коллекцию ListBox отображает новый элемент, но без запуска события.

MainWindow.xaml.cs:

public partial class MainWindow:Window
{
    public ObservableCollection<string> Collection { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        Collection = new ObservableCollection<string>();
        var custBinding = new Binding()
        {
            Source = Collection,
            NotifyOnSourceUpdated = true
        };
        intList.SourceUpdated += intList_SourceUpdated;
        intList.SetBinding(ItemsControl.ItemsSourceProperty, custBinding);
    }

    private void intList_SourceUpdated(object sender, DataTransferEventArgs e)
    {
        MessageBox.Show("Updated!");
    }

    private void btnAddInt_Click(object sender, RoutedEventArgs e)
    {
        var randInt = new Random().Next();
        Collection.Add(randInt.ToString());
    }
}

MainWindow.xaml:

<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Test"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <Button x:Name="btnAddInt" Content="Button" HorizontalAlignment="Left" Margin="41,31,0,0" VerticalAlignment="Top" Width="75" Click="btnAddInt_Click"/>
    <ListBox x:Name="intList" HorizontalAlignment="Left" Height="313" Margin="160,31,0,0" VerticalAlignment="Top" Width="600"/>

</Grid>

Что мне не хватает, что это не работает? Спасибо за совет.

1 Ответ

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

SourceUpdated запускается только для элементов, которые могут принимать входные данные и напрямую изменять исходное значение базы данных.

https://msdn.microsoft.com/en-us/library/system.windows.data.binding.sourceupdated(v=vs.110).aspx

В этом случае сам список не обновляет коллекцию, а обновляется с помощью нажатия кнопки. Это не имеет ничего общего со списком, запускающим событие SourceUpdated.

Только элементы ввода, которые могут принимать ввод, такие как текстовые поля, флажки, переключатели и настраиваемые элементы управления, использующие эти элементы управления, смогут выполнять двустороннее связывание и передавать свои значения обратно в источник, к которому он привязан.

Возможно, вы ищете CollectionChanged, который будет срабатывать при добавлении или удалении элементов из коллекции.

https://msdn.microsoft.com/en-us/library/ms653375(v=vs.110).aspx

Collection = new ObservableCollection<string>();
Collection.CollectionChanged += (s, e) =>
{
    // collection changed!
};

Надеюсь, это поможет! Ура!

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