WPF 数据绑定组合框绑定并不总是发生

本文关键字:数据绑定 组合 绑定 WPF | 更新日期: 2023-09-27 18:32:20

我在UserConrtol中有一个DataGrid,它有 5 个 cols - 1 个标题(只读),3 个文本框和 1 个组合框。我把DataGrid绑定到ObservableCollection.我面临的唯一问题是:如果我只更改行ComboBox ComboBox则"Unit"的属性绑定不会更新。如果我也更改了其他 col 和 ComboBox 的值,那么它就会更新。
但是,如果我只更改列表中的ComboBox项并退出网格/行,则 ComboBox 属性不会更新。我尝试了不同的方法,但无法找到上述原因。代码是:

<DataGrid AutoGenerateColumns="False" Height="133" Name="dgvData" Width="550" BorderBrush="#FFB7B39D" 
                  Background="LightYellow" RowBackground="LightGray" AlternatingRowBackground="#FFFFFFF5" BorderThickness="10" 
                  CanUserReorderColumns="False" CanUserSortColumns="False" CanUserDeleteRows="False"
                  FontSize="13" CanUserAddRows="False" ItemsSource="{Binding Step3ModelList, Mode=TwoWay}">              
     <DataGrid.Columns>
         <DataGridTextColumn Header="" Binding="{Binding SqueezeHeader, ValidatesOnExceptions=True}" MinWidth="110" IsReadOnly="True"/>
         <DataGridTextColumn Header="Preflush" Binding="{Binding Preflush, ValidatesOnExceptions=True}" MinWidth="110"/>
         <DataGridTextColumn Header="Main Injection" Binding="{Binding MainInjection, ValidatesOnExceptions=True}" MinWidth="110"/>
         <DataGridTextColumn Header="Overflush" Binding="{Binding Overflush, ValidatesOnExceptions=True}" MinWidth="110"/>
         <DataGridTemplateColumn x:Name="reasonColumn" Header="Unit" Width="Auto" >
               <DataGridTemplateColumn.CellTemplate>
                   <DataTemplate>
                       <!-- ComboBox ItemsSource="{Binding Path=DataContext.UnitItems, RelativeSource={RelativeSource AncestorType=UserControl}}" SelectedValue="{Binding Unit, Mode=TwoWay}" Text="Unit" /  -->
                      <ComboBox ItemsSource="{Binding Path=DataContext.UnitItems, RelativeSource={RelativeSource AncestorType=UserControl}}" SelectedValue="{Binding Unit, ValidatesOnExceptions=True}" >
                      </ComboBox>
                  </DataTemplate>
             </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
    <DataGrid.RowValidationRules>
           <validator:SqueezeEntryValidation ValidationStep="UpdatedValue" />
    </DataGrid.RowValidationRules>
    <DataGrid.RowValidationErrorTemplate>
        <ControlTemplate>
            <Grid Margin="0,-2,0,-2" ToolTip="{Binding RelativeSource={RelativeSource
                                                FindAncestor, AncestorType={x:Type DataGridRow}},
                                                            Path=(Validation.Errors)[0].ErrorContent}">
                <Ellipse StrokeThickness="0" Fill="Red" Width="{TemplateBinding FontSize}" Height="{TemplateBinding FontSize}" />
                <TextBlock Text="!" FontSize="{TemplateBinding FontSize}" FontWeight="Bold" Foreground="White" HorizontalAlignment="Center"  />
            </Grid>
        </ControlTemplate>
    </DataGrid.RowValidationErrorTemplate>
 </DataGrid>

实现INotifyPropertyChanged的对象的单位属性

    public string Unit
    {
        get { return unit; }
        set
        {
            if (unit != value)
            {
                unit = value;
                Changed("Unit");
            }
        }
    }

验证规则

public class SqueezeEntryValidation : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        Step3Model model = (value as BindingGroup).Items[0] as Step3Model;
        if (model.SqueezeHeader == null || model.SqueezeHeader == string.Empty)
            return new ValidationResult(false, "Squeeze Header can not be empty");
        if (model.Preflush < 0)
            return new ValidationResult(false, "Preflush can not be negative");
        if (model.Overflush < 0)
            return new ValidationResult(false, "Overflush can not be negative");
        if (model.MainInjection < 0)
            return new ValidationResult(false, "MainInjection can not be negative");
        return ValidationResult.ValidResult;
    }
}

我也尝试在ComboBox上调用Validate,以便更新结果,但是当值更改时ComboBox永远不会调用Validate

我如何确保 ComboBox 的 Unit 属性始终更新 - 是否有任何TextBox被更新。 用户单击Tab或以任何方式失去焦点或用户执行的任何操作,如果值发生更改,则必须更新。

谁能帮我解决这个问题。我错过了什么或出错了什么?

WPF 数据绑定组合框绑定并不总是发生

尝试将UpdateSourceTrigger=PropertyChanged添加到 SelectedValue 绑定中。

<ComboBox ItemsSource="{Binding Path=DataContext.UnitItems, RelativeSource={RelativeSource AncestorType=UserControl}}" SelectedValue="{Binding Unit, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}" >
</ComboBox>