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>
* "값이 의도 한대로 설정되지 않았습니다"* - 사용자 컨트롤 (xaml, 생성자 등)을 표시하지 않았습니다. 더 많이 당신은 내부에있는'DataContext'를 가지고 놀 것입니다. 이것이 바인딩이 작동하지 않는 이유입니다. 출력 창에서 바인딩 오류를 확인하십시오. – Sinatr
도움이되었으므로 문제에 대한 더 많은 통찰력을 갖게되었습니다. DataContext에 한 유일한 수정은 ViewModel에 사용되도록 할당하는 것이 었습니다. 그리고 현재 존재할 것으로 기대되는 모든 속성을 가지고 있습니다. 다음과 같이 요약됩니다. 왜 Label이 바인딩되었지만 ReferencedItem에서는 바인딩이 작동하지 않습니까? 콘솔 출력을 점검 할 때 다음과 같은 오류가 발생했습니다 : System.Windows.Data 오류 : 40 : BindingExpression 경로 오류 : 'id'속성이 'object'에 없습니다. 'ReferencedItemCtrlViewModel' 다른 객체를 사용하고 올바르게 바인딩하는 라벨입니까? –
코드에서 어딘가에서 사용자 정의 컨트롤의 DataContext를 설정한다고 말하고 있습니까? 우리는 약간의 코드를 볼 수 있습니까? –