我正在创建一个 DataGrid ,并从代码中填充。当网格首次显示 RadioButton 列时,“包含”似乎工作正常。问题是,在我更改排序后,RadioButton 不再正常工作。你可以垃圾点击它,点击窗外然后再回来,或者事件只是等待,它最终会起作用,但显然它不是真的可用。这是一个简单的例子:
using System.Data;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
InitializeDataGrid();
}
private void InitializeDataGrid()
{
var table = GetTestTable();
var newGrid = new DataGrid
{
CanUserAddRows = false,
CanUserSortColumns = true,
AutoGenerateColumns = true,
ItemsSource = table.AsDataView(),
DataContext = table
};
newGrid.AutoGeneratingColumn += dataGrid_AutoGeneratingColumn;
UxRootGrid.Children.Add(newGrid);
}
private static DataTable GetTestTable()
{
DataTable table = new DataTable("name");
table.Columns.Add("Include", typeof (bool));
table.Columns.Add("Number", typeof (int));
for (int i = 0; i < 5; i++)
{
var row = table.NewRow();
row[0] = false;
row[1] = i;
table.Rows.Add(row);
}
return table;
}
void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyName != "Include")
{
return;
}
DataTemplate template = GetDataTemplate();
DataGridTemplateColumn templateColumn = new DataGridTemplateColumn
{
Header = "Include",
CellTemplate = template,
CellEditingTemplate = template,
};
e.Column = templateColumn;
}
private static DataTemplate GetDataTemplate()
{
var elementFactory = new FrameworkElementFactory(typeof (RadioButton));
var binding = new Binding("Include")
{
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};
elementFactory.SetBinding(ToggleButton.IsCheckedProperty, binding);
elementFactory.SetValue(RadioButton.GroupNameProperty, "BindingGroup");
return new DataTemplate {VisualTree = elementFactory};
}
}
}
这是Xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel Name="UxRootGrid">
</StackPanel>
</Window>
所以,要看问题:
1.启动申请
2.单击数字1旁边的RadioButton
3.单击“数字”标题两次(按降序排序)
4.现在点击Number 4旁边的RadioButton
5.请注意,现在取消选择Number 1旁边的RadioButton,但未选择Number 4旁边的RadioButton。
6.再次单击Number 4旁边的RadioButton。最终它将被选中。
更新:我的另一位同事在他的机器上尝试了这个,他花了一两次时间来分类/选择单选按钮来查看问题,但最终他最终和我一样。
我对WPF很新,所以我希望这只是我的一个简单错误。任何有关获得变通方法或其他设置方法的帮助都将非常感激。
答案 0 :(得分:0)
我能够通过使用位于此处的Peter Staev的 RadioButtonExtended 类来解决问题:http://pstaev.blogspot.com/2008/10/binding-ischecked-property-of.html
正如他在帖子中建议的那样,我只是将 RadioButton 的用法替换为 RadioButtonExtended ,然后将其绑定到 IsCheckedReal 而不是< I>器isChecked 的。