WPF 数据绑定-绑定数据组集合

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);
}

你可能感兴趣的:(C#,编程,wpf,ui,c#,数据绑定)