2013-12-23 41 views
2

我有一个绑定边框控件的“宽度”属性的问题。当我用一个常量绑定它时,更改会反映在运行时,但是当我将它与转换器绑定时会失败,即使转换器返回的值与常量相同。绑定宽度属性与多重绑定给出的宽度为零

这里是用户控件。问题在于“边框”对象。如果我这样做,控制工程为spected:

<UserControl.Resources> 
     <DataTemplate x:Key="DataTemplateHeat"> 
      <Border Margin="1,0,0,0" BorderBrush="Black" BorderThickness="1" Width="100"> 
      </Border> 
     </DataTemplate> 
    </UserControl.Resources> 
    <DockPanel> 
     <ItemsControl x:Name="CnvHeats" ItemsSource="{Binding}" ItemTemplate="{StaticResource DataTemplateHeat}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" Background="Red" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </DockPanel> 
</UserControl> 

Espected result

,但如果我这样做,控制系统出现故障。该转换器执行的正确的次数,并且参数都OK,但即使我硬编码返回值失败:

<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}"/> 
        </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" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </DockPanel> 
</UserControl> 

,这里是转换器:

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(); 
    } 
} 

Fail control result

任何帮助都是有帮助的。先谢谢你。

+0

它适用于简单的绑定和转换器,即使使用100但不使用多重绑定和转换器。奇怪..!! –

回答

2

如果您在调试这个例子中,在Visual Studio Output窗口会显示以下错误:

System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='100' MultiBindingExpression:target element is 'Border' (Name=''); target property is 'Width' (type 'Double')

错误文本说明该问题,请通过你的转换器返回的值是不是Double。将您的退货声明更改为return 100.0;并查看结果。

+0

你是对的!我在结果窗口中看不到错误,但是它的工作效果使其翻倍。谢谢,我没有想到返回的数据类型。 – Ansenagy

+1

@Novitchi - 但是如果我使用'Binding'而不是'MultiBinding',它也可以使用'100'。 –

相关问题