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>
* "値は意図したとおりに設定されていません" * - ユーザーコントロール(xaml、コンストラクタなど)を表示していません。あなたが 'DataContext'を内部で演奏している可能性が高いので、これがバインディングが機能しない理由です。出力ウィンドウでバインドエラーを確認します。 – Sinatr
これは参考になりました。私がDataContextに対して行った唯一の変更は、それをViewModelに割り当てて、使用することを期待するすべてのプロパティを持っていることです。 私は、次のようなことに気付いています:ラベルはバインドされますが、ReferencedItemではバインドされません。 System.Windows.Dataエラー:40:BindingExpressionパスエラー: 'オブジェクト'に 'Id'プロパティが見つかりませんでした '' ReferencedItemCtrlViewModel ' これは参考になりますが、なぜですか?別のオブジェクトを使用して正しくバインドするラベルですか? –
コード内のどこかで、ユーザーコントロールのDataContextを設定していますか?私たちは少しコードを見ることができますか? –