我有一个 WPF 应用程序,其中有两个组合框,代表分配给某项工作的生产/制造工程师,其中 CurrentEngNotice 是相关工作:
<TextBlock Text="Product Engineer:" Style="{StaticResource HeaderStyleTextBlock}" HorizontalAlignment="Left"/>
<ComboBox Grid.Column="1"
ItemsSource="{Binding ProductionEngineers}"
DisplayMemberPath="FullName"
SelectedValuePath="UserID"
SelectedValue="{Binding CurrentEngChangeNotice.ProductEng.UserID, Mode=TwoWay}"/>
<TextBlock Grid.Row="1" Text="Manufacturing Engineer:" Style="{StaticResource HeaderStyleTextBlock}" HorizontalAlignment="Left"/>
<ComboBox Grid.Row="1" Grid.Column="1"
ItemsSource="{Binding ManufacturingEngineers}"
DisplayMemberPath="FullName"
SelectedValuePath="UserID"
SelectedValue="{Binding CurrentEngChangeNotice.MfgEng.UserID, Mode=TwoWay}"/>
这些组合框的绑定是有效的,因为它显示了数据库中填充内容的正确值。但是,当我从应用程序更改此字段时,该字段的设置器不会运行,因此数据库不会更新。这些是绑定属性:
public Engineer ProductEng
{
get { return _productEngineer; }
set
{
if (_productEngineer != value)
{
_productEngineer = value;
OnPropertyChanged();
UpdateDatabase("PRODUCT_ENG", value.UserID);
}
}
}
public Engineer MfgEng
{
get { return _mfgEngineer; }
set
{
if (_mfgEngineer != value)
{
_mfgEngineer = value;
OnPropertyChanged();
UpdateDatabase("MFG_ENG", value.UserID);
}
}
}
通过调试,我已经确认问题不在于 UpdateDatabase 方法,因为 setter 从未被触发。我知道这不是 NULL 问题,因为在数据库方面,我们在创建记录时应用默认的“未知工程师”,这会在我创建新记录时显示。我还可以确认这不是 DataContext 问题,因为除了这两个字段之外的每个字段都按预期触发。感觉我一定是缺少 XAML 中的某个设置,但我在这里不知所措。
像这样的绑定
SelectedValue="{Binding CurrentEngChangeNotice.ProductEng.UserID}"
(默认为 TwoWay),正在改变的是
UserID
属性所持有的 Engineer 对象的 ProductEng
属性,而不是 ProductEng
属性本身。
您应该如下所示更改属性声明(假设
UserID
属性类型为字符串)。
public string ProductEngID
{
get { return _productEngineerID; }
set
{
if (_productEngineerID != value)
{
_productEngineerID = value;
OnPropertyChanged();
UpdateDatabase("PRODUCT_ENG", _productEngineerID);
}
}
}
public string MfgEngID
{
get { return _mfgEngineerID; }
set
{
if (_mfgEngineerID != value)
{
_mfgEngineerID = value;
OnPropertyChanged();
UpdateDatabase("MFG_ENG", _mfgEngineerID);
}
}
}
并将 SelectedValue 绑定更改为:
SelectedValue="{Binding CurrentEngChangeNotice.ProductEngID}"
SelectedValue="{Binding CurrentEngChangeNotice.MfgEngID}"