为什么 WPF/XAML 绑定使用 x:Reference 是喜怒无常的?
Why is WPF/XAML Binding using x:Reference temperamental?
我有一个 WPF/XAML DataGrid,其中一列包含图像。我希望该列的宽度(以及图像的大小)由不在 DataGrid 中的滑块控制。 (我知道这本身会带来问题,但我找到了一个很好的解决方案 here。)问题是,滑块 Value 和列 Width 之间的绑定似乎非常脆弱。如果用户调整父级 window 的大小,导致 DataGrid 调整大小,绑定就会中断。如果我在 DataGrid 中设置 VerticalScrollBarVisibility="Auto",然后用户调整滑块以使 DataGrid 的滚动条需要出现,那么绑定就会中断。一旦绑定被破坏,它就不会回来,除非用户关闭 window 并重新打开它。
下面是相关的 DataGrid 列定义:
<DataGridTemplateColumn Width="{Binding Source={x:Reference PictureSizeSlider}, Path=Value}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Name="ImageBox" Stretch="Uniform" Source="{Binding Image}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
这是滑块定义(在不同的网格中):
<Slider Grid.Column="1" Name="PictureSizeSlider" Minimum="10" Maximum="255" Value="100" IsMoveToPointEnabled="True"/>
任何人都可以告诉我为什么绑定如此脆弱,以及我如何才能使其稳固吗?
使用绑定转换器在 DataGridLength
和 double
之间进行转换:
public class DataGridLengthConverter : IValueConverter
{
public object Convert(
object value, Type targetType, object parameter, CultureInfo culture)
{
var length = (DataGridLength)value;
return length.UnitType == DataGridLengthUnitType.Pixel ? length.Value : 0d;
}
public object ConvertBack(
object value, Type targetType, object parameter, CultureInfo culture)
{
return new DataGridLength((double)value);
}
}
将其应用于滑块的 Value
属性 的绑定:
<DataGridTemplateColumn x:Name="imageColumn" Width="100">
...
</DataGridTemplateColumn>
<Slider Value="{Binding Width,
ElementName=imageColumn,
Converter={StaticResource DataGridLengthConverter}}" .../>
与您原来的绑定相比,这个绑定是双向的,因此可以在两个方向上工作,即当您操作 Slider 或 DataGrid 列时。
当绑定 属性 由绑定以外的来源设置时,单向绑定将被替换,例如直接设置属性值。
我有一个 WPF/XAML DataGrid,其中一列包含图像。我希望该列的宽度(以及图像的大小)由不在 DataGrid 中的滑块控制。 (我知道这本身会带来问题,但我找到了一个很好的解决方案 here。)问题是,滑块 Value 和列 Width 之间的绑定似乎非常脆弱。如果用户调整父级 window 的大小,导致 DataGrid 调整大小,绑定就会中断。如果我在 DataGrid 中设置 VerticalScrollBarVisibility="Auto",然后用户调整滑块以使 DataGrid 的滚动条需要出现,那么绑定就会中断。一旦绑定被破坏,它就不会回来,除非用户关闭 window 并重新打开它。
下面是相关的 DataGrid 列定义:
<DataGridTemplateColumn Width="{Binding Source={x:Reference PictureSizeSlider}, Path=Value}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Name="ImageBox" Stretch="Uniform" Source="{Binding Image}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
这是滑块定义(在不同的网格中):
<Slider Grid.Column="1" Name="PictureSizeSlider" Minimum="10" Maximum="255" Value="100" IsMoveToPointEnabled="True"/>
任何人都可以告诉我为什么绑定如此脆弱,以及我如何才能使其稳固吗?
使用绑定转换器在 DataGridLength
和 double
之间进行转换:
public class DataGridLengthConverter : IValueConverter
{
public object Convert(
object value, Type targetType, object parameter, CultureInfo culture)
{
var length = (DataGridLength)value;
return length.UnitType == DataGridLengthUnitType.Pixel ? length.Value : 0d;
}
public object ConvertBack(
object value, Type targetType, object parameter, CultureInfo culture)
{
return new DataGridLength((double)value);
}
}
将其应用于滑块的 Value
属性 的绑定:
<DataGridTemplateColumn x:Name="imageColumn" Width="100">
...
</DataGridTemplateColumn>
<Slider Value="{Binding Width,
ElementName=imageColumn,
Converter={StaticResource DataGridLengthConverter}}" .../>
与您原来的绑定相比,这个绑定是双向的,因此可以在两个方向上工作,即当您操作 Slider 或 DataGrid 列时。
当绑定 属性 由绑定以外的来源设置时,单向绑定将被替换,例如直接设置属性值。