UI设计:
列表绑定数据集合
<ListBox Name="lstProducts" Margin="5" DisplayMemberPath="ModelName" SelectionChanged="lstProducts_SelectionChanged">
后台代码:
private ICollection<Product> products;
products = App.StoreDb.GetProducts();
lstProducts.ItemsSource = products;
UI设计中Grid绑定列表控件:
<Grid Name="gridProductDetails" DataContext="{Binding ElementName=lstProducts, Path=SelectedItem}" TextBox.LostFocus="txt_LostFocus">
有效性检查:
<Grid.BindingGroup>
<BindingGroup x:Name="productBindingGroup">
<BindingGroup.ValidationRules>
<local:NoBlankProductRule></local:NoBlankProductRule>
</BindingGroup.ValidationRules>
</BindingGroup>
</Grid.BindingGroup>
元素绑定属性,并设置
<TextBox Margin="5" Grid.Row="2" Grid.Column="1">
<TextBox.Text>
<Binding Path="UnitCost" NotifyOnValidationError="true" StringFormat="{}{0:C}">
<Binding.ValidationRules>
<local:PositivePriceRule Max="999.99"></local:PositivePriceRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
添加检查类:
using System.Globalization;
using System.Windows.Data;
using StoreDatabase;
namespace WpfApp
{
internal class NoBlankProductRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
BindingGroup bindingGroup = (BindingGroup)value;
// This product has the original values.
Product product = (Product)bindingGroup.Items[0];
// Check the new values.
string newModelName = (string)bindingGroup.GetValue(product, "ModelName");
string newModelNumber = (string)bindingGroup.GetValue(product, "ModelNumber");
if ((newModelName == "") && (newModelNumber == ""))
{
return new ValidationResult(false,
"A product requires a ModelName or ModelNumber.");
}
else
{
return new ValidationResult(true, null);
}
}
}
}
文本框修改后属性值随失去焦点时生效
private void txt_LostFocus(object sender, RoutedEventArgs e)
{
productBindingGroup.CommitEdit();
}
列表选择变化时
private void cmdUpdateProduct_Click(object sender, RoutedEventArgs e)
{
// Make sure update has taken place.
FocusManager.SetFocusedElement(this, (Button)sender);
}
网友评论