【问题标题】:How can I access a checked Radio Button in a data bound ItemsControl?如何访问数据绑定 ItemsControl 中选中的单选按钮?
【发布时间】:2011-01-13 16:51:44
【问题描述】:

我有一个 ItemsControl 绑定到一个字符串列表。

代码:-

List<string> possibleAnswers;
possibleAnswers = GetPossibleAnswers(currentQuestion);
AnswerIC.Items.Clear();
AnswerIC.ItemsSource = possibleAnswers;

Xaml:-

<ItemsControl x:Name="AnswerIC" Grid.Row="1" Margin="0,10,0,10">
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel x:Name="AnswerSP" Orientation="Vertical"/>
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <RadioButton GroupName="AnswerRBG" Content="{Binding}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

在按钮单击事件中,我试图找到选中的单选按钮的内容,但无法找到。有人有建议吗?我应该补充一点,我是 Silverlight 的完全业余爱好者。

【问题讨论】:

  • 请出示显示您的情况和您尝试过的代码。
  • 抱歉,代码被删除了

标签: silverlight data-binding windows-phone-7


【解决方案1】:

你可以像下面那样做

1) 注册单选按钮点击事件

Click="RadioButton_Click"

2) 做Tag="{Binding}"

3)

private void RadioButton_Click(object sender, RoutedEventArgs e)
{
     RadioButton rb = sender as RadioButton;
     var contant= rb .tag;
 }

【讨论】:

  • 不要认为这会起作用 - 或者如果它会起作用,我不会关注。我有一个提交按钮,在该按钮的单击事件中,我试图找到选中的单选按钮。
  • 然后您可以将此结果保存在全局变量 hare 中,然后在单击提交按钮时将其拉出
  • 如果您使用这种技术,我建议您处理Checked 事件,而不是Clicked。这样可以避免不必要的调用。
【解决方案2】:

您可以通过枚举 Items 来完成此操作,而不是为每个 RadioButton 添加单击事件处理程序

string answer = string.Empty;

foreach (var item in AnswerIC.Items)
{
    var rb = AnswerIC.ItemContainerGenerator
                     .ContainerFromItem(item).FindVisualChild<RadioButton>();

    if (rb.IsChecked ?? false)
    {
        answer = item.ToString();
        break;
    }
}

if (string.IsNullOrEmpty(answer))
{
    MessageBox.Show("Please select an answer");
}
else
{
    MessageBox.Show(string.Format("You chose: {0}", answer));
}

使用以下扩展方法(另见http://geekswithblogs.net/codingbloke/archive/2010/12/19/visual-tree-enumeration.aspx

public static T FindVisualChild<T>(this DependencyObject instance) where T : DependencyObject
{
    T control = default(T);

    if (instance != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(instance); i++)
        {
            if ((control = VisualTreeHelper.GetChild(instance, i) as T) != null)
            {
                break;
            }

            control = FindVisualChild<T>(VisualTreeHelper.GetChild(instance, i));
        }
    }

    return control;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2012-06-13
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多