0

これが私の問題です。次のように UserControl を作成しました。

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 プロパティを見つけようとすると、見つかりません。何を見逃したのかわからないし、これを理解するために実際に利用できるデバッグ ツールもわかりません。

誰でも知恵を共有できる経験がありますか?

4

1 に答える 1

1

渡される実際のデータは何ですか?それはあなたが作成しなければならないものであり、あなたが試みているパススルー状況ではありません.

プロパティ変更ハンドラーで渡される実際のデータを対象とする依存関係プロパティを作成します。change イベントで、内部コードを呼び出して 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 プロジェクトに使用しました。

于 2012-12-12T21:11:24.827 に答える