Связывание свойства width с многосвязью дает ширину нуля

У меня проблема с привязкой свойства width для пограничного элемента управления. Когда я связываю его с константой, это изменение отражается во время выполнения, но когда я связал его с отказом преобразователя, даже если конвертер возвращает то же значение, что и константа.

Вот пользовательский элемент управления. Проблема связана с объектом "Border". Если я это сделаю, управление будет работать так, как показано на рисунке:

<usercontrol.resources>
 <datatemplate x:key="DataTemplateHeat">
 <border margin="1,0,0,0" borderbrush="Black" borderthickness="1">
 </border>
 </datatemplate>
 </usercontrol.resources>
 <dockpanel>
 <itemscontrol x:name="CnvHeats" itemssource="{Binding}" itemtemplate="{StaticResource DataTemplateHeat}">
 <itemscontrol.itemspanel>
 <itemspaneltemplate>
 <stackpanel orientation="Horizontal" background="Red">
 </stackpanel></itemspaneltemplate>
 </itemscontrol.itemspanel>
 </itemscontrol>
 </dockpanel>

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

<usercontrol.resources>
 <datatemplate x:key="DataTemplateHeat">
 <border margin="1,0,0,0" borderbrush="Black" borderthickness="1">
 <border.width>
 <multibinding converter="{StaticResource proportionalWidthConverter}">
 <binding mode="OneWay" path="GraphProportion">
 <binding mode="OneWay" path="ActualWidth" relativesource="{RelativeSource FindAncestor, AncestorType={x:Type StackPanel}, AncestorLevel=1}">
 </binding></binding></multibinding>
 </border.width>
 </border>
 </datatemplate>
 </usercontrol.resources>
 <dockpanel>
 <itemscontrol x:name="CnvHeats" itemssource="{Binding}" itemtemplate="{StaticResource DataTemplateHeat}">
 <itemscontrol.itemspanel>
 <itemspaneltemplate>
 <stackpanel orientation="Horizontal" background="Red">
 </stackpanel></itemspaneltemplate>
 </itemscontrol.itemspanel>
 </itemscontrol>
 </dockpanel>

и вот конвертер:

public class ProportionalWidthConverter : IMultiValueConverter
{
 public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 {
 return 100;
 }

 public object[] ConvertBack(
 object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
 {
 throw new NotImplementedException();
 }
}

Любая помощь оценивается. Заранее спасибо.

1 ответ

Если вы запустите этот пример в Debug, окно вывода в visual studio покажет вам следующую ошибку:

Ошибка System.Windows.Data: 5: значение, созданное BindingExpression, недействительно для целевого свойства; Value = '100' MultiBindingExpression: целевой элемент - "Border" (Name = ''); target является "Width" (тип "******")

Текст ошибки объясняет проблему, значение, возвращаемое вашим конвертером, не равно ******. Измените оператор return 100.0; чтобы return 100.0; и посмотреть результат.

licensed under cc by-sa 3.0 with attribution.