2013-09-16 5 views
3

Я пытаюсь привязать ширину моих столбцов в DataGrid к свойству параметров приложения. У меня это работает, когда привязка установлена ​​в режим OneWay, но мне нужно, чтобы параметр обновлялся в зависимости от ширины столбца при закрытии приложения. Когда я меняю режим привязки на TwoWay, связывание ломается все вместе. Мой код ниже, как я могу это сделать?TwoWay Binding MySettings to DataGrid Column Width

enter image description here

Расширение класса

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> 
+0

Спасибо за удивительный решение –

ответ

0

DataGridTextColumn.Width Свойство может определенно обращаться с Two Way Binding, поэтому я могу только предположить, что ваш заказ Binding OBJ ect вызывает эту проблему. Вы сказали, что Binding сломался, но вы не сообщили нам, что это за ошибка. В качестве простого теста, попробуйте заменить его со стандартным Binding класса:

<DataGridTextColumn Header="STACK" Width="{Binding StackColumnWidth}" /> 

Еще одна вещь, следует отметить, что на DataGridColumn.Width Property странице в MSDN, он говорит:

DisplayValue ширины собственности ограничивается следующими свойствами, если они установлены, в порядке старшинства:

• DataGridColumn.MaxWidth

• DataGrid.MaxColumnWidth

• DataGridColumn.MinWidth

• DataGrid.MinColumnWidth

Таким образом, может необходимо, чтобы убедиться, что они устанавливаются в соответствующие значения. Однако это не вызывает проблемы.

Если вы все еще не можете получить любое разрешение, вы можете попробовать вручную сохранение значения, как приложение закрывается, если у вас есть ссылка на элемент управления DataGrid:

int index = dataGrid.Columns.Single(c => c.Header == "STACK").DisplayIndex; 
double width = dataGrid.Columns[index].Width; 
1

Проблема заключается в том, что ширина имеет типа DataGridLength и нет преобразователя по умолчанию не обратно в два раза, так что вам нужно будет создать свой собственный конвертер, чтобы сделать это, вот пример преобразователя, который должен работать:

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; 
    } 
} 
1

Спасибо за ответы, это был вопрос типа данных , Вместо использования конвертера я просто изменил тип данных настройки на DataGridLength. Ничего другого не изменилось, и все работает так, как должно. Еще раз спасибо.

enter image description here