Dou*_*oug 12 data-binding wpf binding converter
我想根据容器的宽度设置TextBlock的宽度减去TextBlock上设置的边距.
这是我的代码
<TextBlock x:Name="txtStatusMessages"
Width="{Binding ElementName=LayoutRoot,Path=ActualWidth }"
TextWrapping="WrapWithOverflow"
Foreground="White"
Margin="5,5,5,5">This is a message
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
这很有效,除了由于Left和Right Margins bbeing设置为5而TextBlock为10个单位太大的事实.
好的,所以我想......让我们使用转换器.但我不知道如何传递容器控件的ActualWidth(参见上图:LayoutRoot).
我知道如何使用转换器,甚至是带参数的转换器,只是不是像......参数ElementName = LayoutRoot,Path = ActualWidth
例如,我无法完成这项工作......
Width="{Binding Converter={StaticResource PositionConverter},
ConverterParameter={Binding ElementName=LayoutRoot,Path=ActualWidth }}"
Run Code Online (Sandbox Code Playgroud)
我希望我已经说清楚了,希望你可以提供帮助,因为Google今晚对我毫无帮助.
TIA!
道格
Dan*_*rod 13
你应该使用另一个控件作为源,而不是参数.参数必须是常量,在您的情况下可以是-5.
我现在不在VS附近所以语法可能不准确,但是,它是这样的:
Width="{Binding ElementName=LayoutRoot, Path=ActualWidth,
Converter={StaticResource PositionConverter}, ConverterParameter=-5}"
Run Code Online (Sandbox Code Playgroud)
(转换器将接收-5作为字符串,并且在使用之前必须将其转换为数字.)
根据我的经验,最好使用DependecyProperty XXX的OnXXXChanged回调,而不是将相同窗口/根控件内的控件绑定到另一个.其中一个原因是您可能希望稍后将它们绑定到外部元素.
或者,使用multibinding:
<TextBlock>
<TextBlock.Width>
<MultiBinding Converter="{StaticResource yourConverter}">
<MultiBinding.Bindings>
<Binding /> <!-- Bind to parameter 1 here -->
<Binding /> <!-- Bind to parameter 2 here -->
</MultiBinding.Bindings>
</MultiBinding>
</TextBlock.Width>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
和一个转换器,将两个参数转换为您想要的值.
小智 6
是的..多重绑定对我有用..实际上我试图发送一个元素作为一个convereterparameter,但它不接受.这就是为什么我将元素作为值传递给转换器类.
下面是我的例子..
<ListView ... >
<ListView.View>
<GridView>
<GridViewColumn Header="xyz" >
<GridViewColumn.Width>
<MultiBinding Converter="{StaticResource GetWidthfromParentControl}">
<MultiBinding.Bindings>
<Binding ElementName="lstNetwork" Path="ActualWidth"/>
<Binding ElementName="MyGridView"/>
</MultiBinding.Bindings>
</MultiBinding>
</GridViewColumn.Width>
....
</GridViewColumn>
<GridViewColumn ...>
....
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)
在窗口调整大小时,我的第一个gridviewcolumn必须调整大小,而不是其他两个gridviewcolumns ..我通过listview的Actualwidth和总gridview对象作为元素..如果你去转换器代码...
class GetWidthfromParentControl : IMultiValueConverter
{
#region IMultiValueConverter Members
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
GridView view = values[1] as GridView;
GridViewColumnCollection collc = view.Columns;
double actualWidths = collc[1].ActualWidth + collc[2].ActualWidth;
return ((double)values[0] - actualWidths );
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
这对我有用...... :)
| 归档时间: |
|
| 查看次数: |
32326 次 |
| 最近记录: |