Почему сравнение всей модели возвращает 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/csharp/language-reference/operators/equality-operators