为什么 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"/>

任何人都可以告诉我为什么绑定如此脆弱,以及我如何才能使其稳固吗?

使用绑定转换器在 DataGridLengthdouble 之间进行转换:

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 列时。

当绑定 属性 由绑定以外的来源设置时,单向绑定将被替换,例如直接设置属性值。