XAML绑定不一致

时间:2017-09-20 12:58:32

标签: c# wpf xaml data-binding

我有一个名为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>

1 个答案:

答案 0 :(得分:0)

我只想发布我遇到的答案(解释)。

问题是在构造函数中更改了ReferencedItem用户控件的DataContext。该视图将实例化ReferencedItem并更改DataContext - 因此,一旦到了绑定时间,我已经从预期的Reference翻转了上下文。

有多种方法可以解决时间问题 - 所有项目都依赖于此。要么避免将DataContext设置在一起,将其设置为绑定后,要么根据需要更改其他项目的上下文。

非常感谢SinatrAndrew StephensMike Strobel所有人在某个时刻提到这一点 - 只花了我一些时间来实现它。我认为没有办法为评论分配信用,但如果有评论,请告诉我。