2017-04-25 7 views
0

내 MVVM ViewModel에 대한 usercontrol에서 사용자 정의 종속성 속성에 바인딩하는 데 문제가 있습니다. 내 사용자 컨트롤이 제대로 난 내보기에 직접 사용할 때 작동 :사용자 정의 컨트롤이 itemspaneltemplate에 바인딩

<local:CustomControl Mode="{Binding Mode, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0"> 
     <Button x:Name="InfoBox1" Content="Test1" /> 
     <Button x:Name="InfoBox2" Content="Test2" /> 
    </local:CustomControl> 

그러나 바인딩 itemspaneltemplate로 사용하는 것은 작동하지 않습니다 : 나는 RelativeSource 및 발견을 사용하려고했습니다

<ItemsControl Grid.Row="0" ItemsSource="{Binding Equipment}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <local:CustomControl Mode="{Binding Mode, Mode=TwoWay}"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       ... 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

itemscontrol/view 및 모드 또는 DataContext.Mode 경로를 설정하지만 바인딩을 작동시키지 못했습니다.

모드는 다음과 같이 정의된다

public static readonly DependencyProperty ModeProperty; 

    public Modes Mode 
    { 
     get { return (Modes)this.GetValue(ModeProperty); } 
     set { this.SetValue(ModeProperty, value); } 
    } 

및 사용자 지정 컨트롤의 생성자에 등록 :

public CustomControl() 
    { 
     Mode = Modes.Default; 
    } 

    static CustomControl() 
    { 
     ModeProperty = DependencyProperty.Register("Mode", typeof(Modes), typeof(CustomControl), new FrameworkPropertyMetadata(Mode.Default, OnModeChanged)); 
    } 

    private static void OnModeChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     CustomControl ctrl= o as CustomControl ; 
     if (ctrl== null) return; 

     Modes mode = (Modes)e.NewValue; 
     ctrl.Mode = mode; 
    } 

내가 패널 템플릿으로 작업 제어를 얻을 수있는 해결 방법을 사용하기 위해 필요하거나 수행 나는 바인딩을 너무 엉망으로 엉망 이냐?

---- 편집

뷰 모델 부분 :

private Modes _mode= Modes.Default; 
    public Modes Mode 
    { 
     get { return _mode; } 
     set { _mode= value; NotifyPropertyChanged(); } 
    } 

    private ObservableCollection<EquipmentViewModel> _equipment; 
    public ObservableCollection<EquipmentViewModel> Equipment 
    { 
     get { return _equipment; } 
     set { _equipment = value; NotifyPropertyChanged(); } 
    } 

---- Edit2가 : 내가 더 조사했고 좀 더 복합체입니다. ItemsPanelTemplate의 컨트롤과 그리드의 컨트롤에 다음을 추가했습니다.

Visibility="{Binding Visible, Converter={StaticResource visibilityConverter}}" 

이 Visible 부울을 변경하면 두 경우 모두 작동합니다. 따라서 사용자 지정 DependencyProperty에만 문제가있는 것으로 보입니다.

컨트롤의 DataContext를 시각적 트리를 검사하여 ItemsPanelTemplate이 올바른지 확인하십시오.

항목 매개 변수 템플릿으로 사용하지 않을 때 종속성 속성을 올바르게 사용할 때 올바르게 작동하도록하려면 어떻게해야합니까?

+0

ItemsControl의 DataContext는 무엇이고 Mode 소스 속성은 어디에 정의되어 있습니까? Equipment 속성과 동일한 클래스에 정의되어 있으면 작동해야합니다. – mm8

+0

모드는 내 장비와 함께 내 viewmodel에 정의됩니다. 내가 그것을 변경하는 버튼을 가지고 첫 번째 xaml (사용자 정의 컨트롤의 바로 사용)에 대한 작동합니다. 그러나 ItemsControl에서 바인딩이 작동하지 않습니다. –

+0

이 내용을 읽어야합니다. https://stackoverflow.com/help/mcve – mm8

답변

0

이상한 상충 작용을 일으키는 것을 찾아 냈습니다. I는 Itemspaneltemplate으로서 제어를 사용하는 경우이 appearently 충돌을 일으키는 통상의 ctor

public CustomControl() 
{ 
    Mode = Modes.Default; 
} 

의 특정 속성 값으로 설정 하였다. 이를 제거하면 바인딩 작업이 예상대로 이루어졌습니다.

나는 행동의 차이가 서로 다른 시간에 생성자에 대한 호출과 관련이 있다고 생각하십니까?