Как отправить событие объекту, с которым связан элемент управления? - PullRequest
0 голосов
/ 24 марта 2019

Вместо создания обработчика для события click в элементе управления xaml, я хочу, чтобы этот обработчик был внедрен в класс объекта, с которым связан элемент управления. Если это возможно.

Я делаю Game of Life в WPF, у меня есть класс Cell, одним из его свойств является Color, который изменяется при изменении другого свойства State. Состояние может быть либо мертвым, либо живым. В MainWindow.xaml.cs я создаю экземпляр ObservableCollection of Cells. В MainWindow.xaml у меня есть UniformGrid, который связан с ObservableCollection Cells, и когда ячейка меняет свое состояние, ячейка в UniformGrid меняет свой цвет. Я хочу сделать обработчик для события Click для DataGridCell, и этот обработчик должен быть реализован в классе Cell, чтобы ячейка, связанная с щелкнутым DataGridCell, запускала свой собственный обработчик.

Сотовый класс:

    public class Cell : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName){/*...*/}

        public void ChangeState(object sender, MouseButtonEventArgs e){/*...*/}

        private CellState state;
        public CellState State{/*...*/}
        private CellState nextState;
        public Color Color{/*...*/}

        /* Other irrelevant stuff */
    }

Я продолжаю получать, что MainWindow не содержит определения 'ChangeState', и я хотел бы как-то обойти его, так как я хочу, чтобы обработчик находился внутри самого класса Cell.

MainWindow.xaml.cs:

    public MainWindow()
        {
            InitializeComponent();
            var vm = new ViewModel();

            for (int i = 0; i < 100; i++)
            {
                vm.Cells.Add(new Cell());

            DataContext = vm;
        }

MainWindow.xaml:

    <ItemsControl ItemsSource="{Binding Cells}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="10"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <DataGridCell BorderThickness="0.1" MouseUp="ChangeState">
                    <DataGridCell.Background>
                        <SolidColorBrush Color="{Binding Color}"/>
                    </DataGridCell.Background>
                </DataGridCell>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

1 Ответ

0 голосов
/ 24 марта 2019

Я думаю, вам нужно больше узнать о шаблоне mvvm и интерфейсе ICommand. Тогда вы можете использовать ToggleButton

<ToggleButton Command="{Binding MyCommand}"/>

А в вм:

public ICommand MyCommand => new RelayCommand(() => /* your method, for example cell adding *\);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...