Связывание свойств массива - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть класс (приложение Winforms), который отслеживает состояние группы реальных коммутаторов и сохраняет их состояние открытия / закрытия в двух массивах.Один массив представляет собой статус в двоичном (0,1) формате, а другой - в строковом («открытый», «закрытый») формат.Пользовательский интерфейс использует строковый формат, а внутренние вызовы используют оба формата, поэтому мне нужны оба массива.

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

Я рассмотрел возможность использования какого-либо вида привязки, но, видимо, Winforms не будет связывать свойства, только WPF.Я также рассмотрел возможность использования Set каждого свойства, чтобы иметь логику для установки элемента другого (см. Ниже), но я не могу понять, как настроить Set для доступа к отдельным элементам массива (возможно, к индексатору, хотя я не уверенесли это правильный путь, так как я ничего о них не знаю).

Вот код, который у меня есть на данный момент, и, конечно, он не работает, потому что он не знает, как приравнять массив к intв логическом утверждении.

Любая помощь с решением будет принята с благодарностью.Спасибо.

public class SystemStatus
{
    public string[] strStatus
    {
        get
        {
            return strStatus;
        }
        set
        {
            strStatus = value;
            binStatus = value == "closed" ? 1 : 0;
        }
    }
    public int[] binStatus
    {
        get
        {
            return binStatus;
        }
        set
        {
            binStatus = value;
            strStatus = value == 1 ? "closed" : "open";
        }
} 

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

не уверен в своей цели, но вы можете попробовать это:

class SystemStatus
    {
        private string[] strStatus_;
        private int[] binStatus_;

        public string[] strStatus
        {
            get
            {
                return strStatus_;
            }
            set
            {
                strStatus_ = value;
                binStatus_ = new int[strStatus_.Length];
                for (int i = 0; i < strStatus_.Length; i++)
                {
                    binStatus_[i] = strStatus_[i] == "closed" ? 1 : 0;
                }

            }
        }
        public int[] binStatus
        {
            get
            {
                return binStatus_;
            }
            set
            {
                binStatus_ = value;
                strStatus_ = new string[binStatus_.Length];
                for (int i = 0; i < binStatus_.Length; i++)
                {
                    strStatus_[i] = binStatus_[i] == 1 ? "closed" : "open";
                }
            }
        }
0 голосов
/ 22 декабря 2018

Возможно, вы могли бы сделать это так:

strStatus = value.Select(v => v == 1 ? "closed" : "open").ToArray();

И:

binStatus = value.Select(v => v == "closed" ? 1 : 0).ToArray();

Более полное решение:

private string[] _strStatus;
private int[] _binStatus;

public string[] strStatus
{
    get
    {
        return _strStatus;
    }
    set
    {
        _strStatus = value;
        _binStatus = value.Select(v => v == "closed" ? 1 : 0).ToArray();
    }
}
public int[] binStatus
{
    get
    {
        return _binStatus;
    }
    set
    {
        _binStatus = value;
        _strStatus = value.Select(v => v == 1 ? "closed" : "open").ToArray();
    }
}
0 голосов
/ 22 декабря 2018

В пользовательском интерфейсе используется строковый формат ... поэтому мне нужны оба массива

Я бы сказал, что лучшим решением будет иметь один логический массив и изменить код пользовательского интерфейса для визуализацииBoolean как открытый / закрытый или что-то еще.Если вам нужна помощь, опубликуйте некоторый код пользовательского интерфейса, но это должно быть просто.например, используя метод расширения, такой как:

public string ToOpenClosed(this bool value)
{
    return value ? "open" : "closed";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...