如何从wpf列表框中获取选定列表项中的选定单选按钮
How to get selected radio button in selected list item from wpf listbox
列表框图片如下:
Listbox with Dynamic column with check boxes and static radio buttons
我必须从列表框中查找选定的项目,并为每个选定的项目选择单选按钮
<ListBox Height="226" HorizontalAlignment="Left" Margin="404,339,0,0" Name="listBoxItems" VerticalAlignment="Top" Width="282" SelectionChanged="listBoxItems_SelectionChanged" SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="10,5,0,0">
<CheckBox Width="130" x:Name="chbPrescr" Content="{Binding}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}">
<!--<TextBlock Text="{Binding}" Width="115"></TextBlock>-->
</CheckBox>
<RadioButton x:Name="rdOD" Width="40" Content ="OD" Checked="rdOD_Checked" />
<RadioButton x:Name="rdBD" Width="40" Content ="BD" Checked="rdBD_Checked"/>
<RadioButton x:Name="rdTDS" Width="40" Content ="TDS" Checked="rdTDS_Checked"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
并且在回发事件中,我得到了选定的列表项,但不是该选定列表项的选定单选按钮
foreach (var items in listBoxItems.SelectedItems)
{
string a = items.ToString();
ItemCollection itemCollection = listBoxItems.Items;
object currentItem = itemCollection.CurrentItem;
}
我需要知道如何获得每种选定药物的类别。谢谢
您可以将 RadioButtons
的 IsChecked
属性 绑定到数据的来源 属性 class:
这是更好的解决方案。
最快的大概是在可视化树中找到选中的RadioButton
:
private void listBoxItems_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var items in listBoxItems.SelectedItems)
{
ListBoxItem lbi = listBoxItems.ItemContainerGenerator.ContainerFromItem(items) as ListBoxItem;
if (lbi != null)
{
RadioButton rb = FindVisualChildren<RadioButton>(lbi).FirstOrDefault(x => x.IsChecked == true);
if (rb != null)
{
MessageBox.Show("selected: " + rb.Content.ToString());
}
}
}
}
private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
int NbChild = VisualTreeHelper.GetChildrenCount(depObj);
for (int i = 0; i < NbChild; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childNiv2 in FindVisualChildren<T>(child))
{
yield return childNiv2;
}
}
}
}
列表框图片如下:
Listbox with Dynamic column with check boxes and static radio buttons
我必须从列表框中查找选定的项目,并为每个选定的项目选择单选按钮
<ListBox Height="226" HorizontalAlignment="Left" Margin="404,339,0,0" Name="listBoxItems" VerticalAlignment="Top" Width="282" SelectionChanged="listBoxItems_SelectionChanged" SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="10,5,0,0">
<CheckBox Width="130" x:Name="chbPrescr" Content="{Binding}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}">
<!--<TextBlock Text="{Binding}" Width="115"></TextBlock>-->
</CheckBox>
<RadioButton x:Name="rdOD" Width="40" Content ="OD" Checked="rdOD_Checked" />
<RadioButton x:Name="rdBD" Width="40" Content ="BD" Checked="rdBD_Checked"/>
<RadioButton x:Name="rdTDS" Width="40" Content ="TDS" Checked="rdTDS_Checked"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
并且在回发事件中,我得到了选定的列表项,但不是该选定列表项的选定单选按钮
foreach (var items in listBoxItems.SelectedItems)
{
string a = items.ToString();
ItemCollection itemCollection = listBoxItems.Items;
object currentItem = itemCollection.CurrentItem;
}
我需要知道如何获得每种选定药物的类别。谢谢
您可以将 RadioButtons
的 IsChecked
属性 绑定到数据的来源 属性 class:
这是更好的解决方案。
最快的大概是在可视化树中找到选中的RadioButton
:
private void listBoxItems_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var items in listBoxItems.SelectedItems)
{
ListBoxItem lbi = listBoxItems.ItemContainerGenerator.ContainerFromItem(items) as ListBoxItem;
if (lbi != null)
{
RadioButton rb = FindVisualChildren<RadioButton>(lbi).FirstOrDefault(x => x.IsChecked == true);
if (rb != null)
{
MessageBox.Show("selected: " + rb.Content.ToString());
}
}
}
}
private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
int NbChild = VisualTreeHelper.GetChildrenCount(depObj);
for (int i = 0; i < NbChild; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childNiv2 in FindVisualChildren<T>(child))
{
yield return childNiv2;
}
}
}
}