C# 是否有一个IValueConverter可以这样做
我想做什么:C# 是否有一个IValueConverter可以这样做,c#,wpf,xaml,C#,Wpf,Xaml,我想做什么: <Grid> <Grid.RowDefinitions> ... <!--The next line is pseudo code for what I am trying to achieve--> <RowDefintion Height="if(EditEnabled) { 10* } else { 0 }" /> ... </Grid.RowDefinition> ...
<Grid>
<Grid.RowDefinitions>
...
<!--The next line is pseudo code for what I am trying to achieve-->
<RowDefintion Height="if(EditEnabled) { 10* } else { 0 }" />
...
</Grid.RowDefinition>
...
<DockPanel Visibility="{Binding EditEnabled, Converter={StaticResource InverseBooleanToVisibilityConverter}}" ...>
...
...
...
...
...
我试图根据是否启用编辑来更改DockPanel的可见性,同时保持调整大小的能力以及固定高度和相对高度
问题:
<Grid>
<Grid.RowDefinitions>
...
<!--The next line is pseudo code for what I am trying to achieve-->
<RowDefintion Height="if(EditEnabled) { 10* } else { 0 }" />
...
</Grid.RowDefinition>
...
<DockPanel Visibility="{Binding EditEnabled, Converter={StaticResource InverseBooleanToVisibilityConverter}}" ...>
...
是否有IValueConverter
(System.Windows.Data.IValueConverter
)可以接受一个布尔值和两个数字,并根据布尔值选择一个GridLength
s?从仅仅检查IValueConverter
的接口来看,这似乎不是正确的使用类型
或者有没有更好的方法来注入我想要的GridLength
我尝试过的:
<Grid>
<Grid.RowDefinitions>
...
<!--The next line is pseudo code for what I am trying to achieve-->
<RowDefintion Height="if(EditEnabled) { 10* } else { 0 }" />
...
</Grid.RowDefinition>
...
<DockPanel Visibility="{Binding EditEnabled, Converter={StaticResource InverseBooleanToVisibilityConverter}}" ...>
...
- 查看
的继承人-我看不出什么明显的东西IValueConverter
- 将
移动到Height=“10*”
标记内,并将DockPanel
更改为RowDefinition
-这会导致转换异常Auto
- 搜寻
IValueConverter
能在这种情况下工作。(更具体地说:不能使用XAML执行if-then逻辑)
但是您可以在C代码中执行if-then逻辑。
这是解决办法
public class HeightConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool enableEdit = (bool)value;
double param = System.Convert.ToDouble(parameter);
if (enableEdit)
return new GridLength(param, GridUnitType.Star);
else
return new GridLength(0);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
窗户是这样的
<Window.Resources>
<local:HeightConverter x:Key="heightConverter"/>
<sys:Int32 x:Key="param">10</sys:Int32>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="{Binding Path=EditEnabled, Converter={StaticResource heightConverter}, ConverterParameter={StaticResource param}}" />
</Grid.RowDefinitions>
</Grid>
更新使用
窗户是这样的吗
<Window.Resources>
<local:HeightMultiConverter x:Key="heightMutliConverter"/>
<sys:Int32 x:Key="param">10</sys:Int32>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition >
<RowDefinition.Height>
<MultiBinding Converter="{StaticResource heightMutliConverter}">
<Binding Path="EditEnabled"/>
<Binding Source="{StaticResource param}"/>
</MultiBinding>
</RowDefinition.Height>
</RowDefinition>
</Grid.RowDefinitions>
</Grid>
10
注意:请不要忘记,您必须通过设置
DataContext
属性来处理源代码。您可以使用一个内置转换器:。指定一个值列表(任意类型),绑定到一个整数,转换器在值列表中查找该整数(以值计数为模)
如果为此AlternationConverter
指定两个值,并且能够将EditEnabled
属性作为整数0
或1
,则可以将该0
和1
映射到所需的任何值
如果你觉得先把你的bool
转换成整数是没有意义的(我很同情这一点),您仍然可以使用AlternationConverter
作为定制转换器的灵感,该转换器不要求模型值的类型为int
创建布尔转换器
基类,如中所述
公共类BooleanConverter:IValueConverter
{
公共布尔值转换器(T trueValue,T falseValue)
{
真=真值;
假=假值;
}
公共T真{get;set;}
公共T假{get;set;}
公共虚拟对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
返回值为bool&((bool)值)?True:False;
}
公共虚拟对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
返回值为T&&EqualityComparer.Default.Equals((T)值,True);
}
}
然后写
public class BooleanToGridLengthConverter : BooleanConverter<System.Windows.GridLength>
{
public BooleanToGridLengthConverter() : base(
new System.Windows.GridLength(1, System.Windows.GridUnitType.Star),
new System.Windows.GridLength(0))
{
}
}
公共类BooleanToGridLengthConverter:BooleanConverter
{
公共布尔ToGridLength转换器():base(
新的System.Windows.GridLength(1,System.Windows.GridUnitType.Star),
新系统.Windows.GridLength(0))
{
}
}
true和false的值可以直接设置,不需要多值转换器(只要布尔参数需要可绑定)
或者,您可以从MarkupExtension派生转换器,并直接使用它,如下所示:
<RowDefinition Height="{Binding EditEnabled, Converter={convert:BooleanToGridLengthConverter True=10*, False=0}" />
您可以使用IMultiValueConverter
。没有内置的。你必须创造你自己的。这真的很简单。这看起来像我想要的,只是10
是硬编码的-没有传入。我猜Convert
方法只需要一个bool
或一个数字?如果您想传入值10,有一种方法可以做到这一点,我将更新我的答案供您使用parameter@JonnyHeightConverter
可以具有属性,您可以使用与任何其他类型相同的方式设置属性值。您可以将10
放在这样一个属性中,并在Convert
实现中读取该属性。只需在converter类中添加两个属性,并在xaml中相应地设置它们:而不只是返回两个固定值10和0,只需使用这些添加的属性即可。@Jonny我更新了我的答案,并对其进行了测试。它正在工作,您可以将10作为参数传递给转换器,而无需硬编码
<convert:BooleanToGridLengthConverter x:Key="Converter" True="10*" False="0" />
<RowDefinition Height="{Binding EditEnabled, Converter={convert:BooleanToGridLengthConverter True=10*, False=0}" />