Пользовательский интерфейс Silverlight не обновляется - ObservableCollection восстанавливается - PullRequest
0 голосов
/ 08 декабря 2011

Я довольно новичок в ObservableCollections, но создал некоторый код, который, я уверен, должен работать.К сожалению это не так.Единственное, что не происходит, это мой графический интерфейс не обновляется.Я знаю, что значения обновляются сзади (проверено с помощью отладчика).

Что я делаю не так?

Вот пример моего XAML для текстового блока:

<TextBlock Name="tbCallsOpen" Text="{Binding IndicatorValue}" />

Приведу пример моего кода:

public partial class CurrentCalls : UserControl
{
    Microsoft.SharePoint.Client.ListItemCollection spListItems;
    ObservableCollection<CurrentCallIndicator> CallIndicators = new ObservableCollection<CurrentCallIndicator>();        

    public CurrentCalls()
    {            
        InitializeComponent();

        DispatcherTimer dispatchTimer = new DispatcherTimer();
        dispatchTimer.Interval = new TimeSpan(0, 0, 20);
        dispatchTimer.Tick += new EventHandler(BindData);
        dispatchTimer.Start();
    }

    private void BindData(object sender, EventArgs args)
    {
        //splistitems is a sharepoint list. Data is being retrieved succesfully, no issues here.
        foreach (var item in spListItems)
        {
            //My custom class which implements INotifyPropertyChanged
            CurrentCallIndicator indicator = new CurrentCallIndicator();
            indicator.IndicatorValue = item["MyValueColumn"];

            //Adding to ObservableCollection
            CallIndicators.Add(indicator);

        }
        //Setting Datacontext of a normal TextBlock
        tbCallsOpen.DataContext = CallIndicators.First(z => z.IndicatorName == "somevalue");
    }
}

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

Скорее всего, вы предполагаете, что изменения базовых элементов в коллекции вызовут событие CollectionChanged; однако это не то, как работает ObservableCollection<T>.

Если вам нужно такое поведение, вам нужно будет выполнить свою собственную имплентацию, и когда в элементе вашей коллекции будет запущено событие PropertyChanged, вам нужно будет запустить событие CollectionChanged.

1 голос
/ 08 декабря 2011

Ваш код выглядит для меня более-менее корректно, на первый взгляд, хотя я не ожидаю, что вам потребуется использовать ObservableCollection <>, чтобы получить ожидаемые результаты: простой List <> Работало бы просто отлично.

Если отладчик сообщает вам, что DataContext корректно обновляется до ожидаемого элемента, то наиболее вероятной проблемой является проблема с определением вашей привязки.Если вы не видите каких-либо ошибок связывания в вашем окне отладки, тогда я загляну в статью Bea Stollnitz о отладочных привязках .В частности, я часто использую технику, которую она предлагает для «DebugValueConverter», например:

/// <summary>
/// Helps to debug bindings.  Use like this: Content="{Binding PropertyName, Converter={StaticResource debugConverter}}"
/// </summary>
public class DebugConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

И затем устанавливаю точку останова в вашем конвертере и наблюдаю, что происходит.Это хак и клудж, но пока мы все не на SL5 (в котором встроена отладка привязки), это ваш лучший выбор.

0 голосов
/ 12 декабря 2011

Хорошо, отсортировано.Я сам исправил проблему.Поскольку я обновлял значения в цикле, коллекция ObservableCollection не обновлялась должным образом.Все, что я сделал в начале метода привязки данных, это очистил коллекцию: CallIndicators.Clear ();

...