Двухстороннее связывание Listview с ObservableCollection - PullRequest
1 голос
/ 17 мая 2011

:::::::::: ObservableCollection ::::::::::

    ObservableCollection<Friend> Friends = new ObservableCollection<Friend> ( );

:::::::::: InitializeFriends ::::::::::

        private void InitializeFriends ( )
        {
            JsonObject _JsonObject = Process . FacebookClient . Get ( "/me/friends" ) as JsonObject;

            if ( _JsonObject != null )
            {
                JsonArray _JsonArray = _JsonObject [ "data" ] as JsonArray;
                foreach ( JsonObject Friend in _JsonArray )
                {
                    Friends . Add ( new Friend ( ) { Name = Friend [ "name" ] . ToString ( ) } );
                }
            }
        }

:::::::::: Друг ::::::::::

    public class Friend
    {
        public string Name { get; set; }
        public Conversation Chat { get; set; }
        public BitmapImage Image { get; set; }
    }

:::::::::: ListView ::::::::::

        <ListView Name="Panel"
              Width="Auto"
              Margin="0,200,0,0"
              HorizontalAlignment="Stretch"
              VerticalAlignment="Stretch"
              Background="{x:Null}"
              BorderThickness="0"
              ItemsSource="{Binding Path=Friends,
                                    Mode=TwoWay}"
              ScrollViewer.HorizontalScrollBarVisibility="Disabled"
              SelectionMode="Single">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.View>
            <GridView ColumnHeaderContainerStyle="{StaticResource hiddenStyle}">
                <GridViewColumn Width="200" DisplayMemberBinding="{Binding Path=Name}" />
                <GridViewColumn Width="100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <Image Width="30"
                                       Height="30"
                                       Source="{Binding Path=Image}" />
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

Представление в виде списка, которое не является обязательным, может быть обязательным, но не обновляется? !!!
Есть что-то НЕПРАВИЛЬНОЕ

Ответы [ 5 ]

3 голосов
/ 17 мая 2011

Вашему классу Friend необходимо реализовать интерфейс INotifyPropertyChanged , чтобы WPF уведомлял об изменении этого свойства.

2 голосов
/ 17 мая 2011

Если у вас возникли проблемы с привязками XAML, первое, что нужно сделать, - запустить вашу программу под визуальной студией и посмотреть в окне вывода все ошибки или предупреждения, в которых упоминаются XAML или привязки. Если есть проблема, она, скорее всего, появится там.

Ваше окно вывода может быть открыто путем выбора View-> Output из главного меню (или ввода Ctrl + W, O). Если вы ничего не видите, выберите «Отладка» в поле со списком «Показать вывод из».

Если вы все еще ничего не видите, возможно, вам придется изменить уровень трассировки WPF. Вы можете сделать это, выбрав «Отладка» в главном меню и выбрав «Параметры и настройки…». Разверните узел «Отладка» и выберите «Окно вывода». Теперь на правой панели установите значение «Связывание данных» в «Настройках трассировки WPF» как минимум на «Предупреждение». Вы должны увидеть некоторую информацию в окне вывода при следующем запуске приложения под VS.

enter image description here

Если вы все еще не получаете достаточно информации, вы можете изменить уровень трассировки (в .Net 3.5 и выше) в XAML, добавив пространство имен System.Diagnostics в свой файл XAML:

 xmlns:diagnostics=”clr-namespace:System.Diagnostics;assembly=WindowsBase”

и настройку уровня трассировки в привязке интереса следующим образом:

<ListView Name="Panel"
      Width="Auto"
      Margin="0,200,0,0"
      HorizontalAlignment="Stretch"
      VerticalAlignment="Stretch"
      Background="{x:Null}"
      BorderThickness="0"
      ItemsSource="{Binding Path=Friends,
                            Mode=TwoWay,   
                            diagnostics:PresentationTraceSources.TraceLevel=High}"
      ScrollViewer.HorizontalScrollBarVisibility="Disabled"
      SelectionMode="Single">
1 голос
/ 17 мая 2011

Ваша коллекция Friends должна быть выставлена ​​в публичную собственность, т.е.

private readonly ObservableCollection<Friend> _friends = new ObservableCollection<Friend>();
public ObservableCollection<Friend> Friends { get { return _friends; } }
0 голосов
/ 20 августа 2012

Пожалуйста, добавьте это свойство в окно XAML:

DataContext="{Binding RelativeSource={RelativeSource Self}}">
0 голосов
/ 17 мая 2011

если ваш datacontext верен, ваше связывание должно работать. Кстати, вам просто нужен режим = OneWay

<ListView Name="Panel" ItemsSource="{Binding Path=Friends, Mode=OneWay}" />

, поэтому вы должны сначала проверить свой DataContext. Самый простой способ - использовать Snoop . Вы также можете проверить окно вывода в Visual Studio, чтобы увидеть ошибки привязки

...