我正在尝试将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>
答案 0 :(得分: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 :(得分:1)
感谢您的回复,这是一个数据类型问题。我只是将设置的数据类型更改为DataGridLength
,而不是使用转换器。没有其他任何东西被改变,一切都按照它应该运作。再次感谢。
答案 2 :(得分:0)
DataGridTextColumn.Width
属性肯定可以处理Two Way Binding
,因此我只能假设您的自定义Binding
对象导致此问题。你说Binding
坏了,但你没告诉我们错误是什么。作为一个简单的测试,请尝试将其替换为标准Binding
类:
<DataGridTextColumn Header="STACK" Width="{Binding StackColumnWidth}" />
另外需要注意的是,在MSDN的DataGridColumn.Width Property页面上,它说:
Width属性的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;