C# 多绑定转换器不显示结果
作为学习在WPF中正确使用绑定的一部分,我创建了一个小的转换程序,将温度、长度、分数转换为小数等。温度和分数的一切都很好,因为这些都是通过简单的绑定和转换器完成的。不过,我在长度转换方面遇到了一个问题,因为它需要多重绑定才能正常工作 对于控件,我使用两个文本框来表示原始长度和转换后的长度。每一个都有一个匹配的组合框,用户可以在其中选择测量单位,即厘米、英寸、毫米等 通过使用断点,我已经确定条目正在到达Convert方法,并且方法中的代码正在正确计算所有内容。结果变量甚至在方法调用结束时显示正确转换的数字,但该数字没有返回到lengthResult文本框中 我已经尝试了我所能想到的每一次迭代来让它工作,现在谷歌搜索了大约3个小时。我找不到问题,也找不到足够类似的情况的指南,我无法使它适用于这种情况。有人能帮我检查一下,找出我犯的很可能是简单的错误吗 注意:我在C代码中有一个ConvertBack函数,但是除了默认的throw new NotImplementedException之外,它没有任何内容,所以我省略了它。我会在转换工作完成后再担心的 XAML: 文本框需要字符串,而不是双精度字符C# 多绑定转换器不显示结果,c#,wpf,data-binding,converter,multibinding,C#,Wpf,Data Binding,Converter,Multibinding,作为学习在WPF中正确使用绑定的一部分,我创建了一个小的转换程序,将温度、长度、分数转换为小数等。温度和分数的一切都很好,因为这些都是通过简单的绑定和转换器完成的。不过,我在长度转换方面遇到了一个问题,因为它需要多重绑定才能正常工作 对于控件,我使用两个文本框来表示原始长度和转换后的长度。每一个都有一个匹配的组合框,用户可以在其中选择测量单位,即厘米、英寸、毫米等 通过使用断点,我已经确定条目正在到达Convert方法,并且方法中的代码正在正确计算所有内容。结果变量甚至在方法调用结束时显示正确转
应该这样做。我以前试过,现在又试过一次,反复检查,结果仍然是一个空的lengthResult文本框。你对所有返回结果语句都这样做了吗?在整个converterYup过程中,您有很多,这就是问题所在。我只是在最后一条上修改了它,因为最终应该只有一条返回语句。我从倍数开始,然后意识到我可以把它降到一,以避免这个确切的问题,显然在我稍后查看代码时跳过了它们。我知道这会是一件非常简单的事情,就是找不到非常感谢!没问题!通常你只需要第二双眼睛就能看清一切。这是我的标准信条,也是为什么我知道这是一个简单的解决方案值得注意的是,您的代码可以简化很多。执行两步转换,首先从源单位转换为标准单位米,然后从米转换为目标单位,这样可以节省过于复杂的嵌套switch语句。在第二步中,您应该创建仅以SI单位存储值的视图模型。然后,您可以使用两个单独的转换器将视图模型属性绑定到输入和输出字段,这两个转换器只执行单个源/目标单位到SI单位的转换。感谢您的建议,我认为必须有一种更简单的方法来实现这一点,代码重复更少,但我想不出如何做到这一点。我想到的唯一方法是一系列方法,基本上可以取代双常数yd_to_ft,in_to_cm等系列,但实际上可能会更长,只是稍微有点条理,
<GroupBox Header="Length" DockPanel.Dock="Top">
<GroupBox.Resources>
<local:LengthConverter x:Key="lengthConverter" />
</GroupBox.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Label Content="Original Length:" Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="10" />
<Label Content="Destination Length:" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="10" />
<ComboBox x:Name="originUnitSelect" Grid.Column="2" Grid.Row="0" ItemsSource="{Binding Units}" Height="{Binding ElementName=lengthEntry, Path=ActualHeight}" MinWidth="50" />
<ComboBox x:Name="destinationUnitSelect" Grid.Column="2" Grid.Row="1" ItemsSource="{Binding Units}" Height="{Binding ElementName=lengthResult, Path=ActualHeight}" MinWidth="50" />
<TextBox x:Name="lengthEntry" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" Margin="10" HorizontalContentAlignment="Center" MinWidth="250" />
<TextBox x:Name="lengthResult" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" Margin="10" HorizontalContentAlignment="Center" MinWidth="250">
<TextBox.Text>
<MultiBinding Converter="{StaticResource lengthConverter}">
<Binding ElementName="lengthEntry" Path="Text" UpdateSourceTrigger="PropertyChanged" />
<Binding ElementName="originUnitSelect" Path="SelectedValue" />
<Binding ElementName="destinationUnitSelect" Path="SelectedValue" />
</MultiBinding>
</TextBox.Text>
</TextBox>
<Button x:Name="convertLength" Grid.Column="1" Grid.Row="2" Content="Convert" VerticalAlignment="Center" HorizontalAlignment="Center" Click="convertLength_Click" Margin="10"/>
</Grid>
</GroupBox>
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
double result = 0.0;
double cm_to_mm = 10;
double cm_to_in = 0.3937;
double cm_to_ft = 0.32808;
double cm_to_yd = 0.010936;
double mm_to_cm = 0.10;
double mm_to_in = mm_to_cm * cm_to_in;
double mm_to_ft = mm_to_cm * cm_to_ft;
double mm_to_yd = mm_to_cm * cm_to_yd;
double in_to_mm = 25.4;
double in_to_cm = 2.54;
double in_to_ft = 1 / 12;
double in_to_yd = 1 / 36;
double ft_to_yd = 36;
double ft_to_in = 12;
double ft_to_cm = ft_to_in * in_to_cm;
double ft_to_mm = ft_to_in * in_to_mm;
double yd_to_ft = 3;
double yd_to_in = 36;
double yd_to_cm = ft_to_in * in_to_cm;
double yd_to_mm = ft_to_in * in_to_mm;
if(values[1] != null && values[2] != null)
{
switch(values[1].ToString())
{
case "mm":
if (double.TryParse(values[0].ToString(), out result))
{
switch(values[2].ToString())
{
case "cm":
result = result * mm_to_cm;
break;
case "in":
result = result * mm_to_in;
break;
case "ft":
result = result * mm_to_ft;
break;
case "yd":
result = result * mm_to_yd;
break;
}
return result;
}
break;
case "cm":
if(double.TryParse(values[0].ToString(), out result))
{
switch(values[2].ToString())
{
case "mm":
result = result * cm_to_mm;
break;
case "in":
result = result * cm_to_in;
break;
case "ft":
result = result * cm_to_ft;
break;
case "yd":
result = result * cm_to_yd;
break;
}
return result;
}
break;
case "in":
if(double.TryParse(values[0].ToString(), out result))
{
switch(values[2].ToString())
{
case "mm":
result = result * in_to_mm;
break;
case "cm":
result = result * in_to_cm;
break;
case "ft":
result = result * in_to_ft;
break;
case "yd":
result = result * in_to_yd;
break;
}
return result;
}
break;
case "ft":
if(double.TryParse(values[0].ToString(), out result))
{
switch(values[2].ToString())
{
case "mm":
result = result * ft_to_mm;
break;
case "cm":
result = result * ft_to_cm;
break;
case "in":
result = result * ft_to_in;
break;
case "yd":
result = result * ft_to_yd;
break;
}
return result;
}
break;
case "yd":
if(double.TryParse(values[0].ToString(), out result))
{
switch(values[2].ToString())
{
case "mm":
result = result * yd_to_mm;
break;
case "cm":
result = result * yd_to_cm;
break;
case "in":
result = result * yd_to_in;
break;
case "ft":
result = result * yd_to_ft;
break;
}
}
break;
}
}
return result;
//throw new NotImplementedException();
}
return result.ToString();