获取组中所选RadioButton的索引
本文关键字:RadioButton 索引 获取 | 更新日期: 2023-09-27 18:18:15
我有一个参考的RadioButton rb1。
如何获得rb1组中所选RadioButton的索引?
我用谷歌搜索了一会儿,但没有成功。
如有任何帮助,不胜感激
对你的问题的简短回答是你不知道。你应该做的是将RadioButton.IsChecked
绑定到视图模型的某些bool
属性。您可以通过IValueConverter
的实现绑定视图模型的int
属性来实现类似于组索引的功能:
View Model属性:
private int _groupIndex = 1;
public int GroupIndex
{
get { return _groupIndex; }
set
{
if (_groupIndex == value) return;
_groupIndex = value;
OnPropertyChanged("GroupIndex");
}
}
转换器:
public class IndexBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || parameter == null)
return false;
else
return (int)value == System.Convert.ToInt32(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || parameter == null)
return null;
else if ((bool)value)
return System.Convert.ToInt32(parameter);
else
return DependencyProperty.UnsetValue;
}
}
然后像这样绑定:
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<local:IndexBooleanConverter x:Key="IndexBooleanConverter"/>
</StackPanel.Resources>
<RadioButton Content="Option1" IsChecked="{Binding Path=GroupIndex, Converter={StaticResource IndexBooleanConverter}, ConverterParameter=1}"/>
<RadioButton Content="Option2" IsChecked="{Binding Path=GroupIndex, Converter={StaticResource IndexBooleanConverter}, ConverterParameter=2}"/>
<RadioButton Content="Option3" IsChecked="{Binding Path=GroupIndex, Converter={StaticResource IndexBooleanConverter}, ConverterParameter=3}"/>
</StackPanel>
在这种情况下,你的视图模型属性GroupIndex
将有值1,2或3取决于什么RadioButton
勾选
如果你走到这一步,那么你的设计可能有问题,你应该重新考虑。
也就是说,你可以遍历可视树并找到它,像这样:
/// Returns the first GroupBox ancester
public DependencyObject FindAncestor(DependencyObject current)
{
current = VisualTreeHelper.GetParent(current);
while (current != null)
{
if (current is GroupBox)
{
return (T)current;
}
current = VisualTreeHelper.GetParent(current);
};
return null;
}
然后遍历子元素,找到选中的radioButton
public RadioButton FindChild<T>(DependencyObject parent)
{
// Confirm parent and childName are valid.
if (parent == null) return null;
RadioButton foundChild = null;
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
// If the child is not of the request child type child
var childType = child as radioButton;
if (childType == null)
{
// recursively drill down the tree
foundChild = FindChild(child);
// If the child is found, break so we do not overwrite the found child.
if (foundChild != null) return foundChild ;
}
else if (childName.IsChecked == true)
{
return foundChild;
}
}
return null;
}