2017-09-20 13 views
0

ReferencedItemと呼ばれるカスタムのUserControlがあります。それはItemIdと呼ばれるGuidを取るべきです。このようなとして実装されていますXAMLの一貫性のないバインド

private static void OnItemIdChanged(DependencyObject dobj, DependencyPropertyChangedEventArgs dpArgs) 
{ 
    //Do something 
} 

public static readonly DependencyProperty ItemIdProperty = DependencyProperty.Register("ItemId", typeof(Guid?), typeof(ReferencedItem), new FrameworkPropertyMetadata(
    // use an empty Guid as default value 
    Guid.Empty, 
    // tell the binding system that this property affects how the control gets rendered 
    FrameworkPropertyMetadataOptions.AffectsRender, 
    // run this callback when the property changes 
    OnItemIdChanged 
)); 

public Guid? ItemId 
{ 
    get { return (Guid?)GetValue(ItemIdProperty); } 
    set { SetValue(ItemIdProperty, value); } 
} 

public ReferencedItem() 
{ 
    InitializeComponent(); 
    ViewModel = new ReferencedItemCtrlViewModel(); 
    DataContext = ViewModel; 
} 

ItemsSourceのように定義されたReferenceオブジェクトで構成されます:バインドするときに今、これは意図したとおりに値が設定されていないReferencedItem

public class Reference 
{ 
    public Guid Id { get; set; } 
} 

。ここで私が仕事をしたいコードですが、意図したとおりに結合しない:私は試してみました

<ItemsControl x:Name="ReferenceStack" ItemsSource="{Binding References}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Vertical"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <local:ReferencedItem ItemId="{Binding Id}" Height="30" HorizontalAlignment="Stretch" VerticalAlignment="Top"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

:予想通り

<local:ReferencedItem ItemId="128d48f0-f061-49fb-af49-b8e4ef891d03" Height="30" HorizontalAlignment="Stretch" VerticalAlignment="Top"/> 

これは、OnItemIdChanged方法がトリガされた作品。

<Label Content="{Binding Id}" HorizontalAlignment="Left" VerticalAlignment="Top" Height="30" Width="90"/> 

これは期待どおりに動作し、ラベルはIdで表示されます。

ここに何か不足していますか?私はバインド時にデータが利用可能だと言うことができます - それは私が必要とする正確な条件の下でバインドしません:)

ありがとう!

EDIT:ここ

ReferencedItemListのコードビハインドで、XAMLの最初のブロックは、上記投稿:

public partial class ReferencedItemList : UserControl 
{ 
    protected ReferencedItemListCtrlViewModel ViewModel; 

    public ReferencedItemList() 
    { 
     InitializeComponent(); 
     ViewModel = new ReferencedItemListCtrlViewModel(); 
     DataContext = ViewModel; 
    } 

    public void Load(Guid id, string name) 
    { 
     ViewModel.Load(id, name); 
     //ReferenceStack.ItemsSource = ViewModel.References; 
    } 
} 

コメント行で定義したItemsSource="{Binding References}"の代わりにで実験されていますXAMLそれはReferenceが以前この記事で定義されているタイプObservableCollection<Reference>の性質Referencesを持っていることは言うまでもない -

私は成功したウサギの穴を下に行かなくてもReferencedItemListCtrlViewModelためのコードを投稿することができないと思います。

ReferencedItem.xaml:

<v:BaseUserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 
</v:BaseUserControl.Resources> 
<StackPanel Orientation="Horizontal"> 
    <Image x:Name="LinkIcon" Visibility="{Binding HasReference, Converter={StaticResource BooleanToVisibilityConverter}}" ToolTip="View Referenced Item" Source="/Images/link.png" Height="18" MouseUp="LinkIcon_MouseUp"/> 
    <TextBlock x:Name="ReferencedObjectDesc" Text="{Binding ReferenceHierarchy}" FontStyle="Italic" VerticalAlignment="Center" /> 
</StackPanel> 
+1

* "値は意図したとおりに設定されていません" * - ユーザーコントロール(xaml、コンストラクタなど)を表示していません。あなたが 'DataContext'を内部で演奏している可能性が高いので、これがバインディングが機能しない理由です。出力ウィンドウでバインドエラーを確認します。 – Sinatr

+0

これは参考になりました。私がDataContextに対して行った唯一の変更は、それをViewModelに割り当てて、使用することを期待するすべてのプロパティを持っていることです。 私は、次のようなことに気付いています:ラベルはバインドされますが、ReferencedItemではバインドされません。 System.Windows.Dataエラー:40:BindingExpressionパスエラー: 'オブジェクト'に 'Id'プロパティが見つかりませんでした '' ReferencedItemCtrlViewModel ' これは参考になりますが、なぜですか?別のオブジェクトを使用して正しくバインドするラベルですか? –

+0

コード内のどこかで、ユーザーコントロールのDataContextを設定していますか?私たちは少しコードを見ることができますか? –

答えて

0

私はちょうど私が出会った解答(解説)を投稿したかったのです。

問題は、コンストラクタの私のReferencedItemユーザコントロールのDataContextを変更していました。ビューはReferencedItemをインスタンス化し、DataContextを変更します。バインドするときは、既にコンテキストを目的のReferenceから反転していました。

タイミングを解決する方法は複数あります。すべてのプロジェクトに依存します。 DataContextを一括して設定したり、バインド後バインドを設定したり、必要に応じて他の項目のコンテキストを変更したりしないでください。一点または別でこれを言及SinatrAndrew Stephens、およびすべてのためMike Strobel

多くのおかげで - ただ、実際にそれを達するために私にいくつかの時間がかかりました。私はコメントにクレジットを割り当てる方法はないと思うが、もしあれば教えてください。

関連する問題