1. ホーム
  2. c#

[解決済み] XAMLバインディンググループ

2022-01-28 09:11:33

質問

データグリッドの3つのテキストボックスに基づいて、ある行が有効かどうかを計算する結合グループを作ろうとしています。

ValidationRuleクラスを作成し、データグリッドに配置しました。

       <DataGrid.BindingGroup>
          <BindingGroup Name="RowBindingGroup">
             <BindingGroup.ValidationRules>
                <util:MinMaxParValidationRule ValidationStep="CommittedValue" />
             </BindingGroup.ValidationRules>
          </BindingGroup>
       </DataGrid.BindingGroup>

そして

<TextBox.Text>
   <Binding Path="ParStockLevel" UpdateSourceTrigger="PropertyChanged" BindingGroupName="RowBindingGroup" />
</TextBox.Text>

私のバリデーションルールクラスは次のようになります。

 public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
  {
     ValidationResult result = ValidationResult.ValidResult;
     BindingGroup bindingGroup = (BindingGroup)value;

     StockInformationDVM row = (StockInformationDVM)bindingGroup.Items[0];

これで、アプリケーションを実行すると、検証ルールクラスに入る値は常にデータグリッドの最初の行になり、検証される行にはなりません (もちろん、最初の行を検証している場合は別です!)。

私はこれをやったことがなく、私が見つけた例はMVVMを使用していないので、そこに問題があるかもしれません。

どのように解決するのですか?

バインドグループを DataGrid.ItemBindingGroup ではなく DataGrid.BindingGroup :

<DataGrid.ItemBindingGroup>
   <BindingGroup>
      <BindingGroup.ValidationRules>
         <util:MinMaxParValidationRule ValidationStep="CommittedValue" />
      </BindingGroup.ValidationRules>
   </BindingGroup>
</DataGrid.ItemBindingGroup>

そしてこの場合、実はバインディング・グループの名前を指定するのを省略することができます。この場合、バインディンググループの名前を指定する必要はありません。