Почему привязка к структуре не работает? - PullRequest
14 голосов
/ 10 октября 2011

Недавно я столкнулся с проблемой, когда у меня есть ObservableCollection, привязанная к ListView. Люди - это структура, которую я написал. Пока я устанавливаю значения объектов People перед привязкой, кажется, все работает нормально. Однако, когда я пытаюсь установить значения из GUI во время выполнения, базовые объекты, кажется, не отражают изменения.

Я наконец-то преодолел эту проблему, просто изменив людей из структуры в класс. Никаких других изменений не было необходимости.

Может кто-нибудь объяснить мне, почему это так?

Ответы [ 4 ]

22 голосов
/ 10 октября 2011

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

2 голосов
/ 10 октября 2011

ListView представляет собой ItemsControl и работает либо в прямом режиме, где вы заполняете его Items, объявляя несколько объектов ListViewItem в XAML, либо в режиме ItemsSource, где вы устанавливаете Binding для свойства ItemsSource

См. Эту статью доктора WPF для хорошего объяснения .

В любом случае ListView.Items - это ItemCollection, представляющая собой CollectionView, т.е. Items - это не фактическая коллекция, которую вы предоставляете свойству ItemsSource, а нормализованная копия предоставленной вами коллекции, которая позволяет платформе, например, получить доступ к базовому объекту. IEnumerable по индексу, хотя IEnumerable не предоставляет сам индексатор.

Поскольку ListView использует копию, когда он использует коллекцию экземпляров Class, он может создавать копии ссылок, обе ссылки указывают на один и тот же объект в памяти, поэтому эффекты изменения значений в одной из ссылок видны через другая ссылка, но когда он использует коллекцию структур, которые являются типами значений, он должен делать копии значений, а не иметь две ссылки, которые указывают на один и тот же объект, тогда у вас есть два различных объекта типа значения.

2 голосов
/ 10 октября 2011

Поскольку структура передается по значению в элемент управления, поэтому при внесении изменений в пользовательский интерфейс WPF записывает изменения обратно в другой экземпляр People.

Измените его на класс иЯ буду работать.

Если вы не полностью понимаете цель struct, я предлагаю не использовать его.

1 голос
/ 18 февраля 2013

Для всех интересующихся этой темой: Я запустил его с помощью Combobox и Objectdataprovider. «ItemsSource» - это структура, но «SelectedItem» написан где-то еще. Вот оно:

    <!--resources-->
    <ObjectDataProvider x:Key="StructValues"
                        MethodName="GetValues"
                        ObjectType="{x:Type local:MyStruct}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:MyStruct" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

    <ComboBox Margin="0,5"
                      VerticalAlignment="Center"
                      ItemsSource="{Binding Source={StaticResource StructValues}}"/>

А вот так выглядит структура:

public struct MyStruct
{
    public const string A = "A";
    public const string B = "B";
    public const string C = "C";

    public static IEnumerable GetValues(Type type)
    {
        List<String> retVals = new List<string>();
        FieldInfo[] fi = type.GetFields();
        foreach (FieldInfo info in fi)
        {
            retVals.Add(info.Name);
        }
        return retVals;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...