Как обновить ObservableCollection в пользовательском интерфейсе? - PullRequest
0 голосов
/ 03 сентября 2011
foreach (var t in ((App)App.Current).CollectionMessages)
  if (t.Uid.ToString() == uid)
    t.TexT = z;

Элемент в CollectionMessages, поданный TexT, изменяет текст на то, что я хочу. Но пользовательский интерфейс не имеет изменений, он показывает старое значение. Что не так? Пожалуйста, помогите мне.

Xaml:

   <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel Margin="0,0,0,0">
        <TextBlock Text="Диалоги" Style="{StaticResource PhoneTextNormalStyle}" FontSize="{StaticResource PhoneFontSizeLarge}"/>
    </StackPanel>
<Grid Grid.Row="2">
                <Grid d:LayoutOverrides="GridBox" >
                    <ListBox  x:Name="mess_list"  ItemsSource="{Binding}" >
                        <ListBox.ItemTemplate>
                            <DataTemplate >
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>

                                        <TextBlock Text="{Binding TexT}" " />

...

Ответы [ 2 ]

3 голосов
/ 03 сентября 2011

Вам необходимо реализовать интерфейс INotifyPropertyChanged и вызвать событие изменения свойства, чтобы пользовательский интерфейс знал, что оно должно обновляться.

Это Как: страница имеет работающий пример.Вам в основном нужен этот код:

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}

, который вызывается, когда меняется то, что вы хотите обновить.Таким образом, код для TexT становится:

private string localTexT
public string TexT
{
    get { return localTexT; }
    set
    {
        localTexT = value;
        NotifyPropertyChanged("TexT");
    }
}

Из вашего обновления похоже, что вы получили правильную привязку ItemsSource и TextBlock.Однако вы установили DataContext вида?

3 голосов
/ 03 сентября 2011

Необходимо убедиться, что класс, типом которого является t, реализует INotifyPropertyChanged ( MSDN ) и запускает событие PropertyChanged при установке TexT.

...