3

MainWindowに複数回ロードしたいUserControlがあります。このために私は使用しますItemsControl

    <ItemsControl Grid.Row="1"
              ItemsSource="{Binding FtpControlList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel Orientation="Horizontal"
                 IsItemsHost="True" />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ItemsControl.ItemTemplate>
    <DataTemplate DataType="{x:Type my:BackUpControl}">
      <my:BackUpControl Margin="5"
                        Width="500" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

私のUserControlはViewModelによってバインドされています。私のメインウィンドウにもViewModelがあります。MainWindowViewModelには、UserControlViewModelsのリストを保持するOberservableCollection依存関係プロパティがあります。MainWindowViewModelのコンストラクターで、いくつかのUserControlViewModelsをリストに追加します。

    public MainWindowViewModel()
{
  FtpControlList = new ObservableCollection<BackUpControlViewModel>();
  FtpControlList.Add(new BackUpControlViewModel("View 1"));
  FtpControlList.Add(new BackUpControlViewModel("View 2"));
  FtpControlList.Add(new BackUpControlViewModel("View 3"));
}

public static readonly DependencyProperty FtpControlListProperty = DependencyProperty.Register("FtpControlList", typeof(ObservableCollection<BackUpControlViewModel>), typeof(MainWindowViewModel));
public ObservableCollection<BackUpControlViewModel> FtpControlList
{
  get { return (ObservableCollection<BackUpControlViewModel>)GetValue(FtpControlListProperty); }
  set { SetValue(FtpControlListProperty, value); }
}

ここで、何らかの理由で、プロパティが「ビュー1、ビュー2、およびビュー3」に設定されているFtpControlListプロパティのユーザーコントロールではなく、空のユーザーコントロールを3回ロードします。リストのUserControlが空ではなくロードされていることを確認するにはどうすればよいですか?

UserControlViewModelの一部:

    // part of the UserControl Viewmodel
    public BackUpControlViewModel()
{
}

public BackUpControlViewModel(string header)
{
  GroupBoxHeader = header;
}

    #region Dependency Properties
public static readonly DependencyProperty GroupBoxHeaderProperty = DependencyProperty.Register("GroupBoxHeader", typeof(string), typeof(BackUpControlViewModel), new UIPropertyMetadata("empty"));
public string GroupBoxHeader
{
  get { return (string)GetValue(GroupBoxHeaderProperty); }
  set { SetValue(GroupBoxHeaderProperty, value); }
}

public static readonly DependencyProperty FtpUrlProperty = DependencyProperty.Register("FtpUrl", typeof(string), typeof(BackUpControlViewModel), new UIPropertyMetadata("ftpurl"));
public string FtpUrl
{
  get { return (string)GetValue(FtpUrlProperty); }
  set { SetValue(FtpUrlProperty, value); }
}

public static readonly DependencyProperty FtpUserProperty = DependencyProperty.Register("FtpUser", typeof(string), typeof(BackUpControlViewModel), new UIPropertyMetadata("ftpUser"));
public string FtpUser
{
  get { return (string)GetValue(FtpUserProperty); }
  set { SetValue(FtpUserProperty, value); }
}
#endregion

それはおそらく愚かなことでしょうが、私はそれを見つけることができないようです。MainWindowとUserControlのデータコンテキストは、そのViewmodelにバインドされています。

編集:BackupControlデータコンテキストをBackupControlViewModelに設定(レイチェルの質問に答えるため)

   public partial class BackUpControl : UserControl
  {
    public BackUpControl()
    {
      InitializeComponent();
      this.DataContext = new BackUpControlViewModel();
    }
  }
4

3 に答える 3

6

を呼び出した後、コンストラクターで設定することにより、を上書きしていDataContextますUserControlUserControlInitializeComponent();

デフォルトでは、はコレクション内のアイテムごとItemsControlに を作成し、それを のアイテムに設定します。最終結果は 3 つの新しいオブジェクトになり、これらのオブジェクトの背後にあるオブジェクトが元のオブジェクトにバインドされます。ItemTemplateDataContextItemsSourcemy:BackUpControlDataContextBackUpControlViewModelItemsControl.ItemsSource

UserControl のコンストラクターから行を削除するthis.DataContext = new BackUpControlViewModel();と、期待どおりに動作するはずです

于 2012-12-12T19:18:14.277 に答える
0

問題は、ビューモデルに依存関係プロパティがある可能性があります。通常、ビューモデルを実装するだけINotifyPropertyChangedで、プロパティは通常になります (依存関係プロパティではありません)。それらを DP にするという特定の要件がない限り、私はそれらを切り替えます。

于 2012-12-12T16:15:09.760 に答える
0

変化 :

<DataTemplate DataType="{x:Type my:BackUpControl}">

に:

<DataTemplate DataType="{x:Type my:BackUpControlViewModel}">
于 2012-12-12T16:46:12.640 に答える