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

   }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容