【问题标题】:handle check event on checkbox in wpf在 wpf 中处理复选框上的检查事件
【发布时间】:2015-07-04 02:10:11
【问题描述】:

我有一个包含名称和两个复选框(名称、男性(复选框)、女性(复选框))的列表视图。我想确保一次只从列表视图中选择一个复选框。

   <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。我无法从数据模板访问控件以编写检查事件。

【问题讨论】:

    标签: c# wpf listview checkbox wpf-controls


    【解决方案1】:

    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>
    

    代码隐藏:

    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>
    

    【讨论】:

    • 实际上这是我正在尝试做的一个例子。我不想使用单选按钮。无论如何都要用 Chekboxes 来做这件事
    • @AbhishekNehe 再次检查我的答案 :)
    • 我无法在第一个复选框的点击事件中访问第二个复选框。我想实现与单选框相同的功能,但使用复选框。
    • @AbhishekNehe 再次检查我的答案 :)
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2011-03-27
    • 2014-02-01
    • 2012-06-16
    • 2015-10-22
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多