@FAwafawf1212

Как изменить значение чексбокса из другого окна?

Как можно изменить значение чек бокса из другого окна? есть 2 окна, в одном чек бокс с методом в коде, где может меняться значение чекбокса, а в другом окне метод который вызывает срабатывания метода, для того, чтоб менялось значение. Не понимаю, как можно вызвать метод из другого окна?
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
gdt
@gdt
Программист
Как всегда, тут есть простой и правильный способ решения проблемы
Простой метод - просто вызвать метод этого окна. Вы же где-то его отображаете, так ведь? Заведите поле с типом вашего окна с методом, там, где показываете окно - сохраните его туда. Меняете чекбокс - обращаетесь к полю, вызываете метод. Примерно так (код не запускал, где-то может быть нужно немножко иначе написать):
public class MainWindow : Window
{
    private WindowWithMetod _windowWithMetod;
    
    // ........................................................................................

    private void DisplaySecondWindow()
    {
        _windowWithMethod = new WindowWithMethod;
        _windowWithMethod.Closed += (s, e) => _windowWithMethod = null;
        _windowWithMethod.Show();
    }

    private void HandleCheckboxValueChanged(object sender, EventArgs args)
    {
        _windowWithMethod?.Method();
    }
}


Правильный метод - подумать, перед тем, как что-то писать. Смотрите, у вас есть какое-то состояние чего-то, выражаемое чекбоксом, это значит, что имеет смысл держать это что-то отдельно от обоих форм. Нам нужно:
  1. Задавать и хранить какое-то булево значение
  2. Иметь возможность реагировать на его изменение


Определим интерфейсы, с которыми нам было бы удобно иметь дело (имена лучше дать более осмысленные):
public interface IBooleanState
{
    public bool State { get; set; }
}


public interface IBooleanStateEvents
{
    public event EventArgs<bool> StateChanged;
}


Если у вас нет generic-версии EventArgs, возьмите эту:
public sealed class EventArgs<T> : EventArgs
{
    public EventArgs(T value)
    {
        Value = value;
    }

    public T Value { get; }
}


Далее, реализуем наши интерфейсы, удобнее будет сделать это в одном классе:
public sealed class BooleanState : IBooleanState, IBooleanStateEvents
{
    private bool _state;

    public event EventArgs<bool> StateChanged;

    public bool State
    {
        get => _state;
        set
        {
            if (value == _state)
            {
                return;
            }
            
            _state = value;

           StateChanged?.Invoke(this, new EventArgs(value));
        }
    }
}


Далее, нам нужно как-то получить доступ ко всему этому добру из наших форм. Меняем конструкторы и добавляем поля:
public class MainWindow : Window
{
    private readonly IBooleanState _state;
    // ..................
    public MainWindow(IBooleanState state)
    {
        _state = state;
    }
}

public class WindowWithMethod : Window
{
    private readonly _stateEvents;

    public WindowWithMethod(IBooleanStateEvents stateEvents)
    {
        _stateEvents = stateEvents;
    }
}

Когда создаём окна, передаём туда экземпляр нашего BooleanState:
// Наверное где-то в Program.cs 
private readonly BooleanState _state = new BooleanState();
//................................................
Application.Run(new MainWindow(_state));
//................................................

Для второго окна всё зависит от того, где вы его создаёте, если тоже из Program то и передаёте так же, если из MainWindow - придётся кастить:
new WindowWithMethod((IBooleanStateEvents)_state);
Теперь дело осталось за малым, нужно поменять значение из MainWindow, и отреагировать на него в WindowWithMethod:
public class MainWindow : Window
{
    private void HandleCheckboxValueChanged(object sender, EventArgs args)
    {
        _state.State = _checkBox.Checked;
    }
}

public class WindowWithMethod : Window
{
    // .................
    public WindowWithMethod(IBooleanStateEvents stateEvents)
    {
        // ........................
        _stateEvents = stateEvents;
        _stateEvents.StateChanged += HandleStateChanged;
       // .........................
    }

    private void HandleStateChanged(object sender, EventArgs<bool> args)
    {
        Method(args.State);
    }
}


Так вам не придётся торчать наружу публичным методом из второго окна, и появится гораздо больше возможностей для дальнейших изменений. Если лениво - интерфейсы можно не определять и использовать только класс.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы