Как снять флажки в DataTemplate? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть 4 флажка в сетке данных. Я хочу установить IsChecked = false на три других флажка, когда флажок активирован. Из-за использования DataTemplate у меня нет доступа к использованию элементов управления именами.

Используя отправителя, я могу получить доступ только к одному элементу управления одновременно. Но я хочу отключить 3 флажка и активировать флажок.

Это мой шаблон:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <StackPanel Orientation="Vertical" Margin="5" HorizontalAlignment="Right">
            <Metro:MetroSwitch Checked="chk_Checked" Tag="exc" Margin="0,2"  Name="chkExcelent">خیلی خوب</Metro:MetroSwitch>
            <Metro:MetroSwitch Checked="chk_Checked" Tag="good" Margin="0,2" Name="chkGood">خوب</Metro:MetroSwitch>
            <Metro:MetroSwitch Checked="chk_Checked" Tag="notbad" Margin="0,2" Name="chkNotBad">قابل قبول</Metro:MetroSwitch>
            <Metro:MetroSwitch Checked="chk_Checked" Tag="bad"  Name="chkBad">نیاز به تلاش بیشتر</Metro:MetroSwitch>
        </StackPanel>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

и это мой код:

private void chk_Checked(object sender, RoutedEventArgs e)
{
    switch ((sender as Arthas.Controls.Metro.MetroSwitch).Tag.ToString())
    {
        case "exc": Console.WriteLine("exc"); break;
        case "good": Console.WriteLine("ggg"); break;
        case "notbad": Console.WriteLine("nb"); break;
        case "bad": Console.WriteLine("bad"); break;
    }
}

1 Ответ

0 голосов
/ 04 мая 2018

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

<Grid>
    <StackPanel  ToggleButton.Checked="StackPanel_Checked">
        <CheckBox />
        <CheckBox />
        <CheckBox />
        <CheckBox />
    </StackPanel>
</Grid> 

и

    private void StackPanel_Checked(object sender, RoutedEventArgs e)
    {
        CheckBox cb = e.OriginalSource as CheckBox;
        if(cb.IsChecked == false)
        {
            return;
        }
        foreach (var item in ((StackPanel)sender).Children)
        {
            if(item != cb)
            {
                ((CheckBox)item).IsChecked = false;
            }
        }
    }

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

...