簡體   English   中英

MultiBinding Converter不顯示結果

[英]MultiBinding Converter Not Displaying Results

學習正確地在WPF中使用綁定的過程中,我創建了一個小型轉換程序,將溫度,長度,分數轉換為小數等。將所有內容與溫度和分數配合都很好,因為這些都是通過簡單綁定完成的和轉換器。 我在長度轉換方面遇到了問題,因為它需要MultiBinding才能起作用。

對於控件,我使用兩個文本框表示原始長度和轉換后的長度。 它們中的每一個都有一個匹配的組合框,用戶可以在其中選擇度量單位(即厘米,英寸,毫米等)。

使用斷點,我確定條目將進入Convert方法,並且該方法中的代碼可以正確計算所有內容。 result變量甚至在方法調用的末尾顯示正確轉換的數字,但是該數字不會使它返回到lengthResult TextBox中。

我已經嘗試過所有可能想到的迭代,然后將其谷歌搜索了大約3個小時。 我找不到問題,也沒有找到足夠類似的情況的指南,無法解決該問題。 有人可以看看這個,找到我正在犯的(很可能)簡單的錯誤嗎?

注意:我在C#代碼中有一個ConvertBack函數,但是除了默認throw new NotImplementedException之外,它里面什么都沒有,所以我省略了它。 Convert首先工作之后,我會擔心這一點。 :)

XAML:

<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>

C#:

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

textbox需要一個字符串,而不是double

return result.ToString();

應該做到的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM