2017-09-20 3 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 개체로 구성 될 것이다

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; 
    } 
} 

주석으로 줄에 정의 된 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에 사용되도록 할당하는 것이 었습니다. 그리고 현재 존재할 것으로 기대되는 모든 속성을 가지고 있습니다. 다음과 같이 요약됩니다. 왜 Label이 바인딩되었지만 ReferencedItem에서는 바인딩이 작동하지 않습니까? 콘솔 출력을 점검 할 때 다음과 같은 오류가 발생했습니다 : System.Windows.Data 오류 : 40 : BindingExpression 경로 오류 : 'id'속성이 'object'에 없습니다. 'ReferencedItemCtrlViewModel' 다른 객체를 사용하고 올바르게 바인딩하는 라벨입니까? –

+0

코드에서 어딘가에서 사용자 정의 컨트롤의 DataContext를 설정한다고 말하고 있습니까? 우리는 약간의 코드를 볼 수 있습니까? –

답변

0

나는 가로 질러왔다.

문제는 생성자에서 내 ReferencedItem 사용자 정의 컨트롤의 DataContext를 변경하는 것이 었습니다. 이 뷰는 ReferencedItem을 인스턴스화하고 DataContext를 변경합니다. 그래서 바인드 할 시간이되자 이미 Reference의 컨텍스트를 뒤집어 놓았습니다.

타이밍을 해결하는 여러 가지 방법이 있습니다. 모든 프로젝트에 따라 다릅니다. DataContext를 모두 함께 설정하는 것을 피하거나, 바인딩을 설정하거나, 적절하게 다른 항목의 컨텍스트를 변경하십시오. 한 지점 또는 다른에서이 문제를 언급하는 모든 Sinatr, Andrew StephensMike Strobel

많은 감사 - 단지 실제로 도달하는 시간이 좀 걸렸다. 나는 의견에 신용을 할당하는 방법이 있다고 생각하지 않지만, 있다면 알려주지.