2015-04-25 4 views
1

У меня есть список, содержащий имя и два флажка (имя, мужчина (флажок), женщина (флажок)). Я хочу, чтобы только один флажок был выбран из списка.check check event on checkbox in wpf

<UserControl.Resources> 
    <DataTemplate x:Key="datatemp"> 
     <StackPanel Orientation="Horizontal" Width="200" > 
      <TextBlock Text="{Binding VmName}" Width="129" Visibility="Visible" /> 
      <CheckBox Name="cb" IsThreeState="False" Checked="off_chek_select" IsChecked="{Binding IsCheck, Mode=TwoWay}" Margin="6,0,18,6" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
      <CheckBox Name="cb1" IsThreeState="False" Checked="ins_chek_select" IsChecked="{Binding IsCheck1, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
     </StackPanel> 
    </DataTemplate> 
</UserControl.Resources> 

здесь, я использовал этот DataTemplate в ListView. Я не могу получить доступ к элементам управления из datatemplate для записи в событии проверки.

ответ

0

В качестве объекта Tag вы можете поместить ссылку на родительский элемент (в вашем случае это StackPanel), а в коде вы можете найти элемент с помощью метода FindName.

XAML:

<DataTemplate x:Key="datatemp"> 
    <StackPanel x:Name="stackPanel" Orientation="Horizontal" Width="200" > 
     <TextBlock Text="{Binding VmName}" Width="129" Visibility="Visible" /> 
     <CheckBox Name="cb" Tag="{Binding ElementName=stackPanel}" IsThreeState="False" Checked="off_chek_select" IsChecked="{Binding IsCheck, Mode=TwoWay}" Margin="6,0,18,6" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
     <CheckBox Name="cb1" Tag="{Binding ElementName=stackPanel}" IsThreeState="False" Checked="ins_chek_select" IsChecked="{Binding IsCheck1, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
    </StackPanel> 
</DataTemplate> 

Code-за:

private void off_chek_select(object sender, RoutedEventArgs e) 
{ 
    var cbSender = sender as CheckBox; 
    if (cbSender != null) 
    { 
     var stackPanel = cbSender.Tag as StackPanel; 
     if (stackPanel != null) 
     { 
      var cb1 = stackPanel.FindName("cb1") as CheckBox; 
      if (cb1 != null) 
      { 
       cb1.IsChecked = !cbSender.IsChecked; 
      } 
     } 
    } 
} 

private void ins_chek_select(object sender, RoutedEventArgs e) 
{ 
    var cbSender = sender as CheckBox; 
    if (cbSender != null) 
    { 
     var stackPanel = cbSender.Tag as StackPanel; 
     if (stackPanel != null) 
     { 
      var cb = stackPanel.FindName("cb") as CheckBox; 
      if (cb != null) 
      { 
       cb.IsChecked = !cbSender.IsChecked; 
      } 
     } 
    } 
} 

Если у вас есть несколько вариантов, и только один должен быть выбран в то время, вы можете использовать RadioButton (msdn).

<UserControl.Resources> 
    <DataTemplate x:Key="datatemp"> 
     <StackPanel Orientation="Horizontal" Width="200" > 
      <TextBlock Text="{Binding VmName}" Width="129" Visibility="Visible" /> 
      <RadioButton Name="cb" IsThreeState="False" IsChecked="{Binding IsCheck, Mode=TwoWay}" Margin="6,0,18,6" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
      <RadioButton Name="cb1" IsThreeState="False" IsChecked="{Binding IsCheck1, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
     </StackPanel> 
    </DataTemplate> 
</UserControl.Resources> 
+0

Фактически это пример того, что я пытаюсь сделать. Я не хочу использовать радиолюбители. Есть ли все-таки сделать это с Chekboxes –

+0

@AbhishekNehe снова проверить мой ответ :) – kmatyaszek

+0

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