我有一个名为ReferencedItem
的自定义UserControl。它应该采用名为ItemId的Guid。它实现如下:
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
将由定义为:{/ p>的Reference
个对象组成
public class Reference
{
public Guid Id { get; set; }
}
现在绑定此ReferencedItem
时,该值未按预期设置。这是我想要使用的代码,但不按预期绑定:
<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进行渲染。
我有什么东西在这里失踪吗?据我所知,数据在绑定时可用 - 它只是在我需要它的确切条件下不会绑定:)
感谢您的任何意见!
编辑:
以下是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;
}
}
已经尝试过注释行代替XAML中定义的ItemsSource="{Binding References}"
。
我不认为我可以成功发布ReferencedItemListCtrlViewModel
的代码而不会破坏兔子洞 - 不用说它有References
类型的属性ObservableCollection<Reference>
Reference
在本文前面已定义。
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>
答案 0 :(得分:0)
我只想发布我遇到的答案(解释)。
问题是在构造函数中更改了ReferencedItem
用户控件的DataContext。该视图将实例化ReferencedItem
并更改DataContext - 因此,一旦到了绑定时间,我已经从预期的Reference
翻转了上下文。
有多种方法可以解决时间问题 - 所有项目都依赖于此。要么避免将DataContext设置在一起,将其设置为绑定后,要么根据需要更改其他项目的上下文。
非常感谢Sinatr,Andrew Stephens和Mike Strobel所有人在某个时刻提到这一点 - 只花了我一些时间来实现它。我认为没有办法为评论分配信用,但如果有评论,请告诉我。