Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一个IValueConverter可以这样做_C#_Wpf_Xaml - Fatal编程技术网

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@Jonny
HeightConverter
可以具有属性,您可以使用与任何其他类型相同的方式设置属性值。您可以将
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}" />