2016-08-24 10 views
1

私は自分の最初のWPF MVVMパターンソリューションを作成しました。私はUserControlを作成しました。スタイルは同じで、このコントロール間の唯一の違いはデータソースなので、このコントロールをMainWindowで再利用したいと思います。最初のコントロールはObervableCollectionインデックス0を使用し、2番目のUserControlは同じOberservableCollectionインデックス1から使用します。observablecollectionはMainviewModelにあり、UserControl内でバインディングを作成するとバインディングがうまく機能します。私は私のメインウィンドウで私のUserControlの各ネストされたコントロールをバインドしたいUsercontrol異なるコントロールのプロパティアクセス

<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <TextBlock Grid.Row="0" Text="PersonModel.FirstName"></TextBlock> 
     <TextBlock Grid.Row="1" Text="PersonModel.FirstName"></TextBlock> 
    </Grid> 

ユーザーコントロール:

いけないが、このように私のモデルに、ユーザーコントロールの内側にバインドします。

MainWindow.xaml

<desktop:UserControl1 Textblock1.Text="{Binding PersonModel.FirstName} TextBlock2.Text="{Binding PersonModel.LastName}"></desktop:UserControl1> 
+0

似たような質問といくつかの回答http://stackoverflow.com/questions/19491951/xaml-access-to-controls-inside-user-control – Shazter

答えて

1

ここは、バインド可能UserControlとして依存関係プロパティ何かを公開するのは簡単ですCustomTextいずれかになります。

XAMLで
public partial class UserControl1 : UserControl 
{ 
    public string CustomText 
    { 
     get { return (string)GetValue(CustomTextProperty); } 
     set { SetValue(CustomTextProperty, value); } 
    } 
    public static readonly DependencyProperty CustomTextProperty = 
     DependencyProperty.Register("CustomText", typeof(string), typeof(UserControl1), new PropertyMetadata()); 

    public UserControl1() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 
} 

あなたがそれにバインド:

<UserControl ... > 
    <TextBlock Text="{Binding CustomText}" /> 
</UserControl> 

と使用方法は次のようになります。

<local:UserControl1 CustomText="{Binding SomeProperty" /> 

別のアプローチは、例えば、あなたがUserControlの後ろにコードで多くのものを変更することができますこの方法で依存関係プロパティのコールバックを使用することですアニメーションを開始します。

UserControlの完全な子コントロールを公開する方法があるかどうかはわかりませんが、その必要はありません(特定のコントロールの特定のプロパティを変更するために専用の依存プロパティをほとんど作成しない)。


もう一つの可能​​性はUserControlに名前を付け、窓の背後にあるコードでそれを使用することです。例えば今すぐことができますbind in code

public partial class UserControl1 : UserControl 
{ 
    public TextBlock TextBlock => textBlock; // textBlock is x:Name 
    ... 
} 

:そのような場合には、あなたは彼らの名前(x:Name)を与えるとプロパティを使用してUserControlコントロールを公開することができますuserControl1.TextBlock.VisibilityuserControl1x:Name,<local:UserControl1 />)である。

関連する問題