Подтвердить что ты не робот

Почему привязка к структуре не работает?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Для всех, кто интересуется этой темой: Я получил его, с 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;
    }
}