-1

我有一个 WPF 应用程序,我需要在其中执行类似的操作:

<ItemsControl x:Name="lstProducts">
   <ItemsControl.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="{Binding ProductName}" />
      </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>

我在这样的代码中设置了 ItemsSource:lstProducts.ItemsSource = MyEFContext.Products;

到目前为止,一切正常。现在我想使用我自己的UserControl来显示产品,而不是像这样的TextBlock

<ItemsControl x:Name="lstProducts">
   <ItemsControl.ItemTemplate>
      <DataTemplate>
         <my:ProductItemCtl ProductName="{Binding ProductName}" />
      </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>

在我的用户控件中,我创建了一个DependencyProperty类似的(见下文),我ProductNameOnProductNameChanged回调中设置了。

TextBlock绑定时我的用户控件中的 没有更新,ItemsControl并且没有启动回调。

#region ProductName

        /// <summary>
        /// ProductName Dependency Property
        /// </summary>
        public static readonly DependencyProperty ProductNameProperty =
            DependencyProperty.Register("ProductName", typeof(String), typeof(ProductItemCtl),
                new FrameworkPropertyMetadata("",
                    new PropertyChangedCallback(OnProductNameChanged)));

        /// <summary>
        /// Gets or sets the ProductName property. This dependency property 
        /// indicates ....
        /// </summary>
        public String ProductName
        {
            get { return (String)GetValue(ProductNameProperty); }
            set {  SetValue(ProductNameProperty, value); }
        }

        /// <summary>
        /// Handles changes to the ProductName property.
        /// </summary>
        private static void OnProductNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ProductItemCtl target = (ProductItemCtl)d;
            String oldProductName = (String)e.OldValue;
            String newProductName = target.ProductName;
            target.OnProductNameChanged(oldProductName, newProductName);
        }

        /// <summary>
        /// Provides derived classes an opportunity to handle changes to the ProductName property.
        /// </summary>
        protected virtual void OnProductNameChanged(String oldProductName, String newProductName)
        {
            // Set Product Name in the display Here!
            this.txtProductName.Text = newProductName;
        }

        #endregion
4

2 回答 2

0

不是答案,但我不能把它写成评论。如果您像这样简化代码会发生什么:

public static readonly DependencyProperty ProductNameProperty = DependencyProperty.Register(
    "ProductName", typeof(string), typeof(ProductItemCtl), 
    new FrameworkPropertyMetadata(string.Empty,
        (o, e) => ((ProductItemCtl)o).txtProductName.Text = (string)e.NewValue)); 
于 2012-04-17T19:53:14.377 回答
0

Arrrghhh 明白了......我this.ProductName = "";在我的 UserControl 的构造函数中

我在这上面浪费了很多时间……对不起,浪费了你所有的时间。

由于我通过尝试您的代码 Clemens 发现了我将您的答案标记为“已回答”。

谢谢大家。

于 2012-04-17T20:03:28.060 回答