Почему сравнение всей модели возвращает false, когда каждое отдельное свойство возвращает true

Что я пытаюсь сделать:

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

Я сделал модель для хранения моей цветовой схемы:

      [SettingsSerializeAs(SettingsSerializeAs.Xml)]
public class ColorScheme
{
    public int Id { get; set; }
    public SolidColorBrush ColorOne { get; set; }
    public SolidColorBrush ColorTwo { get; set; }
    public SolidColorBrush ColorThree { get; set; }
    public SolidColorBrush ColorFour { get; set; }
    public SolidColorBrush ColorFive { get; set; }
    public SolidColorBrush ColorSix { get; set; }
    public SolidColorBrush ColorSeven { get; set; }
    public SolidColorBrush ColorEight { get; set; }
    public SolidColorBrush ColorNine { get; set; }
    public SolidColorBrush ColorTen { get; set; }

}

Затем я сохраняю цветовую схему в файле settings.settings для пользователя, но когда я снова открываю окно, поле со списком пусто, хотя цветовая схема содержит точные HEX-значения для цветов.

Когда я проверяю сравнение между списком цветовой схемы и моей сохраненной цветовой схемой, она возвращает false, но, что интересно, если я разделяю ее на отдельные сравнения свойств, она возвращает true для всех из них:

      foreach (var colorScheme in AllColorSchemes)
        {
            if (SelectProjectColorScheme != null)
            {

                if (colorScheme.Id == SelectProjectColorScheme.Id
                    || colorScheme.ColorOne == SelectProjectColorScheme.ColorOne
                    || colorScheme.ColorTwo == SelectProjectColorScheme.ColorTwo
                    || colorScheme.ColorThree == SelectProjectColorScheme.ColorThree
                    || colorScheme.ColorFour == SelectProjectColorScheme.ColorFour
                    || colorScheme.ColorFive == SelectProjectColorScheme.ColorFive
                    || colorScheme.ColorSix == SelectProjectColorScheme.ColorSix
                    || colorScheme.ColorSeven == SelectProjectColorScheme.ColorSeven
                    || colorScheme.ColorEight == SelectProjectColorScheme.ColorEight
                    || colorScheme.ColorNine == SelectProjectColorScheme.ColorNine
                    || colorScheme.ColorTen == SelectProjectColorScheme.ColorTen)
                {
                    var test = "yes";
                }

                if (colorScheme == SelectProjectColorScheme)
                {
                    var test = "yes";
                }
            }
        }

В приведенном выше коде первый оператор if возвращает true для всех параметров, а нижний возвращает false. Я пробовал переключаться между SolidColorBrushes, Brushes, преобразовывать HEX-значения в кисти и использовать предопределенные кисти. Ничего из этого не работает для меня.

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

1 ответ

Ваша модель является ссылочным типом, поэтому, когда вы вызываете ==, она фактически проверяет ссылочное равенство (т.е. проверяет, являются ли они просто двумя разными именами для одного и того же объекта, а не проверяет, являются ли они двумя объектами с одинаковыми значениями, что и Вы действительно хотите). Можно переопределить метод == для проверки значений, но, читая это они рекомендуют не делать этого для изменяемых типов. Я не совсем уверен, почему это так (вполне возможно, какая-то глубокая философия программирования), но их совет состоит в том, чтобы вместо этого переопределить Equals(), чтобы он был правильной проверкой значения, и вместо этого вызвать это. Обратите внимание, что если вы пойдете по этому пути, вы также должны переопределить GetHashCode() (может быть, просто ^ все хэш-коды значений вместе или что-то в этом роде).руководство ,

Если, с другой стороны, вы измените свою модель на структуру по умолчанию, Equals() выполнит сравнение значений, но == не будет работать так, как вы хотите, если вы не переопределите его вручную.

Если вы используете C#9 или более позднюю версию, вы можете рассмотреть типы записей, которые будут выполнять сравнение значений, если вы вызовете ==. Вот еще пара полезных ссылок, и удачи.

https://learn.microsoft.com/en-us/dotnet/api/system.valuetype.equals?view=net-6.0#system-valuetype-equals(системный объект)

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/equality-operators

Другие вопросы по тегам