2017-11-13 27 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

これが判明しました。あなたの助けをありがとう! –

関連する問題