0

コードから作成して入力している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の横にあるラジオボタンをクリックします。3。
「番号」ヘッダーを2回クリックします(降順で並べ替えます)。
4.次に、番号4の横にあるラジオボタンをクリックします
。5。番号1の横にあるラジオボタンの選択が解除されていますが、番号4の横にあるラジオボタンが選択されていないことに注意してください。
6.番号4の横にあるラジオボタンをさらに数回クリックします。最終的には選択されるようになります。

更新:別の同僚に彼のマシンでこれを試してもらい、問題が発生するのを確認するためにラジオボタンの並べ替え/選択にさらに1〜2時間かかりましたが、最終的に彼は私と同じ位置になりました。

私はWPFにかなり慣れていないので、これが私の側の単純な間違いであることを願っています。回避策またはこれを設定する別の方法を取得するための助けをいただければ幸いです。

4

1 に答える 1

1

ここにあるPeterStaevによるRadioButtonExtendedクラスを使用して、問題を解決することができました:http: //pstaev.blogspot.com/2008/10/binding-ischecked-property-of.html

彼が彼の投稿で示唆しているように、私はRadioButtonの使用法をRadioButtonExtendedに置き換えてからIsCheckedではなくIsCheckedRealにバインドしました。

于 2012-11-19T18:21:44.423 に答える