3

DataGrid 内の列の幅をアプリケーション設定プロパティにバインドしようとしています。バインドが OneWay モードに設定されている場合はこれが機能しますが、アプリを閉じたときに列の幅に基づいて設定を更新する必要があります。バインド モードを TwoWay に変更すると、バインドがすべて壊れてしまいます。私のコードは以下のとおりです。これを達成するにはどうすればよいですか?

ここに画像の説明を入力

拡張クラス

Public Class SettingBindingExtension
    Inherits Binding

    Public Sub New()
        Initialize()
    End Sub

    Public Sub New(ByVal path As String)
        MyBase.New(path)
        Initialize()
    End Sub

    Private Sub Initialize()
        Me.Source = MySettings.[Default]

        'OneWay mode works for the initial grid load but any resizes are unsaved.
        Me.Mode = BindingMode.OneWay

        'using TwoWay mode below breaks the binding...
        'Me.Mode = BindingMode.TwoWay
    End Sub

End Class

xaml

xmlns:w="clr-namespace:Stack"

<DataGrid>
...
    <DataGridTextColumn Header="STACK" 
                        Width="{w:SettingBinding StackColumnWidth}"/>
...
</DataGrid>
4

3 に答える 3

1

問題は、Width の型が DataGridLength であり、double に戻すデフォルトのコンバーターがないため、それを行うには独自のコンバーターを作成する必要があることです。動作するコンバーターの例を次に示します。

class LengthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        DataGridLengthConverter converter=new DataGridLengthConverter();
        var res = converter.ConvertFrom(value);
        return res;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        DataGridLength length = (DataGridLength)value ;
        return length.DisplayValue;
    }
}
于 2013-09-17T13:04:30.920 に答える