Как я могу сделать значение переменной отслеживать значение другой - PullRequest
0 голосов
/ 07 октября 2018

Вот очень упрощенный пример того, что я имею сейчас:

public static class Settings
{
    public static TH th;
}

public partial class PhrasesFrame
{
    private void SetC1Btn()
    {
        var a = (int)Settings.th;
        vm.C1BtnLabelTextColor = phrase.C1 == true ?
            Styles.A[(int)Settings.th] :
            Styles.A[(int)Settings.th];
    }

Я хотел бы заменить это на:

public partial class PhrasesFrame
{
    // The value of Settings.th can change at any time

    // I want the value of id to change when the 
    // value of (int)Setting.th changes. The way
    // it's coded now I realize it's just a one
    // time assignment

    var id = (int)Settings.th; 

    private void SetC1Btn()
    {
        var a = (int)Settings.th;
        vm.C1BtnLabelTextColor = phrase.C1 == true ?
            Styles.A[id] :
            Styles.A[id];
    }

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Этот класс Settings реализует пользовательский EventHandler (SettingsChangedEventHandler), используемый для уведомления об изменении свойства для его подписчиков:
Вы можете настроить более сложный пользовательский SettingsEventArgs для передачи других значений.

Изменение значения свойства public THProperty вызывает событие:

public static class Settings
{
    public delegate void SettingsChangedEventHandler(object sender, SettingsEventArgs e);
    public static event SettingsChangedEventHandler SettingsChanged;

    private static TH th;
    private static int m_Other;

    public class SettingsEventArgs : EventArgs
    {
        public SettingsEventArgs(TH m_v) => THValue = m_v;
        public TH THValue { get; private set; }
        public int Other => m_Other;
    }

    public static void OnSettingsChanged(SettingsEventArgs e) => 
        SettingsChanged?.Invoke("Settings", e);

    public static TH THProperty
    {
        get => th;
        set { th = value; OnSettingsChanged(new SettingsEventArgs(th)); }
    }
}

Класс PhrasesFrame может подписать событие как обычно:

public partial class PhrasesFrame
{
    private TH id;

    public PhrasesFrame()
    {
        Settings.SettingsChanged += this.SettingsChanged;
    }

    private void SetC1Btn()
    {
        var a = (int)this.id;
        //Other operations
    }

    private void SettingsChanged(object sender, Settings.SettingsEventArgs e)
    {
        this.id = e.THValue;
        SetC1Btn();
    }
}
0 голосов
/ 07 октября 2018

Как насчет добавления Action к вашему классу статических настроек и запуска этого действия из th-сеттера?

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

Проверьте это здесь: https://dotnetfiddle.net/ItaMhL

using System;
public class Program
{
    public static void Main()
    {
        var id = (int)Settings.th;
        Settings.action = () => id = Settings.th;
        Settings.th = 123;
        Console.WriteLine(id);

        Settings.th = 234;
        Console.WriteLine(id);
    }

    public static class Settings
    {
        private static int _th;
        public static int th
        {
            get{return _th;}
            set{
                _th = value;
                action();}
        }

        public static Action action;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...