2

DatePart依存関係プロパティの値をConverterParameter編集要素のコンバーター として渡すために、次のカスタム データグリッド列があります。

Public Class DataGridTimeColumn
    Inherits DataGridTextColumn

    Shared ReadOnly DatePartProperty = DependencyProperty.Register("DatePart", GetType(DateTime?), GetType(DataGridTimeColumn), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, AddressOf RefreshBinding))
    Property DatePart As DateTime?
        Get
            Return GetValue(DatePartProperty)
        End Get
        Set(value As DateTime?)
            SetValue(DatePartProperty, value)
        End Set
    End Property

    Private Shared Sub RefreshBinding(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
        Dim tc As DataGridTimeColumn = d
        tc.Binding = tc.Binding
    End Sub

    Public Overrides Property Binding As BindingBase
        Get
            Return MyBase.Binding
        End Get
        Set(value As BindingBase)
            Dim b As Data.Binding = value
            With b
                .Converter = New TimeConverter
                .ConverterParameter = DatePart
            End With
            MyBase.Binding = b
        End Set
    End Property
End Class

次の XAML を使用します。

<my:DataGridTimeColumn Header="From" Binding="{Binding FromDate}" DatePart="{Binding FromDate}" />
<my:DataGridTimeColumn Header="Until" Binding="{Binding TillDate}" DatePart="{Binding TillDate}" />

しかし、RefreshBinding呼び出されることはありません (ブレークポイントを設定しましたが、トリガーされることはありません)。したがって、が設定されている場合DatePartは常にNothing( null)ConverterParameterです。どうすればこれを修正できますか?

編集

C# の場合:

public class DataGridTimeColumn : DataGridTextColumn
{
    static readonly DependencyProperty DatePartProperty = DependencyProperty.Register(
        "DatePart", typeof(DateTime?), typeof(DataGridTimeColumn),
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, RefreshBinding)
    );

    public DateTime? DatePart
    {
        get { return (DateTime?)GetValue(DatePartProperty); }
        set { SetValue(DatePartProperty, value); }
    }

    private static void RefreshBinding(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    {
        var tc = (DataGridTimeColumn)d;
        tc.Binding = tc.Binding;
    }

    public override System.Windows.Data.BindingBase Binding
    {
        get { return base.Binding; }
        set
        { 
            var b = (Binding)value;
            b.Converter = new TimeConverter();
            b.ConverterParameter = DatePart;
            base.Binding = b;
        }
    }
}
4

4 に答える 4

0

値のフォーマットのみが必要な場合は、Darlene アプローチをお勧めします。魔法のコンバーターが本当に必要な場合は、XAML のバインドを介して設定することをお勧めします (プロパティ定義で設定しようとしている理由がよくわかりません)。

XAML は次のようになります。

 <my:DataGridTimeColumn Header="From" Binding="{Binding FromDate, Converter={StaticResource myTimeConverter}} />

TimeConverter は IValueConverter を実装する必要があり、インスタンスはウィンドウ/データグリッド リソースで定義する必要があります。そのバインディングで TwoWay を定義することもできます。

ここで完全な例を見つけることができます。

2 つ以上のデータを組み合わせたい場合は、MultiBindingを使用できます。

于 2013-06-15T05:08:03.950 に答える
0

あなたが何をしようとしているのか正確には理解できないかもしれませんが、DatePart を表示/編集するだけでも大変な作業のようです。フォーマッタと DataGridTextColumn を使用する方が簡単ですか? WPFバインディングStringFormat短い日付文字列

于 2013-06-11T19:29:22.437 に答える
0

まず、debug を使用して、バインド パスが問題ないかどうかを確認してください。次に、FromDate プロパティがトリガーされているかどうかを確認します。第三に、Snoop を使用して、この DP が更新されているかどうかを監視してください。

最後に、DataGrid には動的バインディングのバグがあることを覚えているので、上記の手順で問題を解決できるかどうかはわかりません。うまくいかない場合は、お知らせください。

于 2013-06-13T03:48:10.770 に答える