2017-11-13 3 views
0

목록보기 컨트롤의 셀 템플릿 안에 배치 된 사용자 지정 사용자 정의 컨트롤의 속성을 바인딩하는 방법을 알아 내려했지만 작동하지 않습니다 . 모든 DisplayMemberBinding 필드가 예상대로 작동하고 올바른 값을 얻었지만 해당 사용자 지정 컨트롤 안에 아무 것도 업데이트되지 않습니다.WPF 바인딩 GridViewColumn.CellTemplate의 DataTemplate 내부 UserControl 속성

<ListView Margin="10" x:Name="lvHistory"> 
       <ListView.Resources> 
        <Style TargetType="{x:Type GridViewColumnHeader}"> 
         <Setter Property="HorizontalContentAlignment" Value="Left" /> 
        </Style> 
       </ListView.Resources> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Header="Database" Width="150" DisplayMemberBinding="{Binding ActiveBackup.Database.Name, Mode=TwoWay}" /> 
         <GridViewColumn Header="Start Time" Width="130" DisplayMemberBinding="{Binding ActiveBackup.StartTime, Mode=TwoWay}" /> 
         <GridViewColumn Header="Time Elapsed" Width="100" DisplayMemberBinding="{Binding ActiveBackup.TimeElapsed, Mode=TwoWay}" /> 
         <GridViewColumn Header="P2" Width="100" DisplayMemberBinding="{Binding Progress, Mode=TwoWay}" /> 
         <GridViewColumn x:Name="progressColumn" Header="Progress" Width="150"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <local:cProgressBarSmall x:Name="pr1" Value="{Binding Progress, Mode=TwoWay}" Visibility="Visible" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
        </GridView> 
       </ListView.View> 
      </ListView> 

코드 뒤에 cProgressBarSmall 제어에서 WPF의 ListView 컨트롤.

public partial class cProgressBarSmall : UserControl 
    { 
     public ActiveBackup ActiveBackup { get; set; } 

     public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(decimal), typeof(cProgressBarSmall)); 

     private decimal _value; 
     public decimal Value 
     { 
      get 
      { 
       return (decimal) GetValue(ValueProperty); 
      } 
      set 
      { 
       _value = value; 
       SetValue(ValueProperty, value); 
       p1.Value = value.ToDoubleNotNull(); 
       pLabel.Text = value.ToPercent(0); 
       if (value == 0) 
       { 
        p1.Visibility = Visibility.Hidden; 
        pLabel.Visibility = Visibility.Hidden; 
       } 
       else if (value.ToDoubleNotNull() >= p1.Maximum) 
       { 
        pLabel.Text = "Finished!"; 
        pLabel.Foreground = new SolidColorBrush(Colors.Black); 
       } 
      } 
     } 
    } 
} 

나는 그것을 따라서 코드 숨김에서 직접 액세스 할 수없는 DataTemplate이에 그리고 때문에 "PR1"에 접근 할 수있는 방법을 찾을 수 없습니다. 바인딩이 작동하지 않습니까? 이전의 열 ("P2"열)은 값을 실제로 업데이트하고 올바르게 표시하는지 확인하기 위해 테스트 열에 있습니다. 그러나 "progressColumn"은 항상 기본값 만 표시합니다.

ListView.View> GridView> GridViewColumn> GridViewColumn.CellTemplate> DataTemplate 계층 내부의 데이터 바인딩에는 특별한 것이 있습니까?

답변

1

첫 번째로 세터에 중단 점을 넣으면 바인딩에 부딪치지 않습니다. Binding은 C# 속성이 아니라 종속성 속성을 설정하기 때문입니다. 그들은 다르다. get/set을 사용하는 C# 속성은 종속성 속성을 둘러싼 선택적 래퍼입니다.

올바른 방법은 코드 뒤에 코드를 거의 또는 전혀 사용하지 않는 것입니다 (코드 숨김은 악의가 없으며이 코드는 필요하지 않음). use a binding in the usercontrol xaml to update the UI. 컨트롤을 숨기거나 표시하고 사용자 정의 컨트롤 XAML에서 스타일 트리거를 사용하여 레이블 텍스트를 업데이트 할 수 있습니다. 이를 위해 뒤에 코드가 필요하지 않습니다.

하지만 기존 코드를 작동시키는 가장 간단한 방법은 다음과 같습니다.

public decimal Value 
    { 
     get { return (decimal)GetValue(ValueProperty); } 
     set { SetValue(ValueProperty, value); } 
    } 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("Value", typeof(decimal), typeof(cProgressBarSmall), 
      new PropertyMetadata(0m, Value_ChangedCallback)); 

    // Has to be static 
    private static void Value_ChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((cProgressBarSmall)d).OnValueChanged(); 
    } 

    private void OnValueChanged() 
    { 
     p1.Value = Value.ToDoubleNotNull(); 
     pLabel.Text = Value.ToPercent(0); 
     if (Value == 0) 
     { 
      p1.Visibility = Visibility.Hidden; 
      pLabel.Visibility = Visibility.Hidden; 
     } 
     else if (Value.ToDoubleNotNull() >= p1.Maximum) 
     { 
      pLabel.Text = "Finished!"; 
      pLabel.Foreground = new SolidColorBrush(Colors.Black); 
     } 
    } 
+0

알 수 있습니다. 도와 줘서 고마워! –

관련 문제