诊断 WPF 用户控件依赖项属性问题的最佳方法是什么



这是我的问题,我创建了一个用户控件,如下所示:

XAML:

<UserControl x:Class="ProcessVisualizationBar.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" xmlns:lb="clr-namespace:ProcessVisualizationBar"
         Name="ProcessVisualizationBar">
    <Border BorderBrush="Silver" BorderThickness="1,1,1,1" Margin="0,5,5,5" CornerRadius="5" Padding="2">
        <ListBox Name="ProcessVisualizationRibbon" Grid.Column="1" Height="40" ItemsSource="{Binding ElementName=ProcessVisualizationBar, Path=ItemsSource}"/>
    </Border>
</UserControl>

代码隐藏(C#):

using System.Windows;
using System.Windows.Controls;
namespace ProcessVisualizationBar
{
    public partial class UserControl1 : UserControl
    {
        public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(System.Collections.IEnumerable), typeof(UserControl));
        public System.Collections.IEnumerable ItemsSource
        {
            get { return ProcessVisualizationRibbon.ItemsSource; }
            set { ProcessVisualizationRibbon.ItemsSource = value; }
        }
        public UserControl1()
        {
            InitializeComponent();
        }
    }
}

我构建了我的用户控件,并将.dll添加到另一个项目的引用中。我在 XAML 的顶部添加了引用,如下所示:

xmlns:uc="clr-namespace:ProcessVisualizationBar;assembly=ProcessVisualizationBar"

然后我去使用控件。

<uc:UserControl1 Grid.Row="2" x:Name="ProcessVisualizationContent" />

它发现控件没问题,但是当我尝试查找我添加到其中的 ItemsSource 属性时,我找不到它。我不确定我错过了什么,也不确定真正可以使用哪些调试工具来解决这个问题。

有人对此有一些经验可以分享他们的智慧吗?

传递的实际数据是什么?这就是你应该创造的,而不是你正在尝试的传递情况。

创建一个依赖项属性,以使用属性更改处理程序传递的实际数据为目标。在更改事件上,调用内部代码以将其绑定到 ProcessVisualazation ItemsSource。这样,您可以通过在事件中放置断点来调试数据何时通过。

下面是一个示例,使用者将在 Xaml 中看到 StringData,并且需要将字符串列表填充到自定义控件中:

  #region public List<string> StringData
  /// <summary>
  /// This data is to be bound to the ribbon control
  /// </summary>
  public List<string> StringData
  {
     get { return GetValue( StringDataProperty ) as List<string>; }
     set { SetValue( StringDataProperty, value ); }
  }
  /// <summary>
  /// Identifies the StringData dependency property.
  /// </summary>
  public static readonly System.Windows.DependencyProperty StringDataProperty =
      System.Windows.DependencyProperty.Register(
          "StringData",
          typeof( List<string> ),
          typeof( UserControl ),
          new System.Windows.PropertyMetadata( null, OnStringDataPropertyChanged ) );
  /// <summary>
  /// StringDataProperty property changed handler.
  /// </summary>
  /// <param name="d">DASTreeBinder that changed its StringData.</param>
  /// <param name="e">Event arguments.</param>
  private static void OnStringDataPropertyChanged( System.Windows.DependencyObject d, System.Windows.DependencyPropertyChangedEventArgs e )
  {
     UserControl source = d as UserControl;
     List<string> value = e.NewValue as List<string>;
     BindDataToRibbon( value );
  }
  #endregion public List<string> StringData 

现在只需创建一个 BindDataToRibbon 方法即可完成繁琐的工作。请注意,我在Visual Studio中使用Jeff Wilcox的Silverlight依赖项片段来生成上述依赖项。我已经将它用于WPF和Silverlight项目。

最新更新