Передать выбранный индекс из ComboBox в качестве параметра конвертера в привязке данных XAML - PullRequest
0 голосов
/ 28 октября 2018

Мой XAML:

<TextBox Text="{x:Bind local:Amount, Converter={StaticResource VolumeConverter}, Mode=TwoWay}"/>
<ComboBox x:Name="ComboBox_Amount_Unit" />

Как передать выбранный индекс ComboBox_Amount_Unit в качестве параметра преобразователю TextBox?

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Вот еще один способ достичь своей цели:

<Page
    x:Class="App12.BlankPage2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App12"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Page.Resources>
        <local:VolumeConverter x:Key="cvt"/>
    </Page.Resources>
    <Grid>
        <StackPanel VerticalAlignment="Center" 
                    HorizontalAlignment="Center">
            <TextBox PlaceholderText="Input value in meter" 
                     Width="300" 
                     Text="{x:Bind InputValue, Mode=TwoWay}"/>
            <Button Content="Calculate" Click="Button_Click"/>
            <ComboBox x:Name="ComboBox_Amount_Unit" 
                      Margin="0,30,0,0" 
                      Loaded="ComboBox_Amount_Unit_Loaded">
                <ComboBox.Items>
                    <ComboBoxItem Content="mm"/>
                    <ComboBoxItem Content="cm"/>
                    <ComboBoxItem Content="M"/>
                    <ComboBoxItem Content="kM"/>
                </ComboBox.Items>
            </ComboBox>
            <TextBlock Name="outputTextBlock" 
                       FontSize="25" 
                       Text="{x:Bind Volume, Mode=OneWay, Converter={StaticResource cvt}}"/>
        </StackPanel>
    </Grid>
</Page>



    public sealed partial class BlankPage2 : Page, INotifyPropertyChanged
        {
            public static BlankPage2 Current;

            public BlankPage2()
            {
                this.InitializeComponent();
                Current = this;
            }



            double _volume; 

            int _inputValue;

            public double Volume
            {
                get { return _volume; }
                set { _volume = value; RaisePropertyChanged(); }
            }

            public int InputValue
            {
                get { return _inputValue; }
                set { _inputValue = value; }
            }

            public int getIndex()
            {
                return ComboBox_Amount_Unit.SelectedIndex;
            }


            public event PropertyChangedEventHandler PropertyChanged;

            void RaisePropertyChanged([CallerMemberName]string name = null)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(name));
                }
            }

            private void ComboBox_Amount_Unit_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if ((sender as ComboBox).SelectedIndex == 0)
                {
                    Volume = InputValue * 1000000000;
                }
                else if ((sender as ComboBox).SelectedIndex == 1)
                {
                    Volume = InputValue * 1000000;
                }
                else if ((sender as ComboBox).SelectedIndex == 2)
                {
                    Volume = InputValue;
                }
                else if ((sender as ComboBox).SelectedIndex == 3)
                {
                    Volume = InputValue / 1000000000;
                }
                else Volume = InputValue;
            }

            private void ComboBox_Amount_Unit_Loaded(object sender, RoutedEventArgs e)
            {
                ComboBox_Amount_Unit.SelectedIndex = 0;
                ComboBox_Amount_Unit.SelectionChanged += ComboBox_Amount_Unit_SelectionChanged;
            }

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                if (ComboBox_Amount_Unit.SelectedIndex == 0)
                {
                    Volume = InputValue * 1000000000;
                }
                else if (ComboBox_Amount_Unit.SelectedIndex == 1)
                {
                    Volume = InputValue * 1000000;
                }
                else if (ComboBox_Amount_Unit.SelectedIndex == 2)
                {
                    Volume = InputValue;
                }
                else if (ComboBox_Amount_Unit.SelectedIndex == 3)
                {
                    Volume = InputValue / 1000000000;
                }
                else Volume = InputValue;
            }
        }


    public class VolumeConverter: IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, string language)
            {
                double val = (double)value;

                if (val == 0.0) return "";

                int index = BlankPage2.Current.getIndex();

                if(index == 0)
                {
                    return val.ToString() + " " + "mm";
                }
                else if(index == 1)
                {
                    return val.ToString() + " " + "cm";
                }
                else if(index == 2)
                {
                    return val.ToString() + " " + "m";
                }
                else if (index == 3)
                {
                    return val.ToString() + " " + "km";
                }

                return val.ToString();
            }

            public object ConvertBack(object value, Type targetType, object parameter, string language)
            {
                throw new NotImplementedException();
            }
        }
0 голосов
/ 29 октября 2018

Спасибо, Шакир Ахмед, за то время, которое вы потратили, чтобы помочь мне с решением.Я сам нашел решение пару часов назад:

    private double                              _BrewAmount                             = 10;
    public  double                              BrewAmount
    {
        get { return _BrewAmount; }
        set
        {
            CorrectedBrewAmount = value.ToString();
        }
    }                                                   // In database.     Holds the volume in liters, no matter the ComboBox unit selection.
    private string                              _CorrectedBrewAmount = "0";
    public  string                              CorrectedBrewAmount
    {
        get
        {
            string[] Result = Convert.VolumeFromLiterWithUnitConversion(BrewAmount, BrewAmountSelectedIndex == -1 ? AppSettings.MeasuringSystem == MeasuringSystem.Systems[MeasuringSystem.Metric] ? LiquidUnit.Liter : LiquidUnit.Gallon : BrewAmountSelectedIndex);
            _CorrectedBrewAmount = Result[0];
            return Result[0];
        }
        set
        {
            _BrewAmount = Convert.VolumeToLiter(System.Convert.ToDouble(value), BrewAmountSelectedIndex == -1 ? AppSettings.MeasuringSystem == MeasuringSystem.Systems[MeasuringSystem.Metric] ? LiquidUnit.Liter : LiquidUnit.Gallon    : BrewAmountSelectedIndex);
            NotifyPropertyChanged("CorrectedBrewAmount");
        }
    }                                           // Not in database. The value shown in the TextBox.
    private int                                 _BrewAmountSelectedIndex = -1;
    public  int                                 BrewAmountSelectedIndex
    {
        get
        {
            return _BrewAmountSelectedIndex;
        }
        set
        {
            _BrewAmountSelectedIndex = value;
            _BrewAmount = Convert.VolumeToLiter(System.Convert.ToDouble(_CorrectedBrewAmount), value == -1 ? LiquidUnit.Liter : value);
            NotifyPropertyChanged("BrewAmountSelectedIndex");
        }
    }                                      // Not in database. The bindable selected index.

У меня есть несколько преобразователей в качестве функций, и я использую исправленное свойство, которое отображается и привязывается в пользовательском интерфейсе, тогда как «реальное» значениев оригинальной собственности.Это выглядит сложно, но работает так, как должно.Вы можете видеть, что CorrectedBrewAmount и BrewAmountSelectedindex устанавливают _BrewAmount так, чтобы установщик BrewAmount (без подчеркивания) не срабатывал.И когда BrewAmount устанавливается из кода, тогда устанавливается CorrectedBrewAmount, который запускает преобразование.

0 голосов
/ 28 октября 2018

Я надеюсь, что это поможет вам (не проверено):

<TextBox x:Name="myTextbox"  Text="{x:Bind local:Amount, Converter={StaticResource VolumeConverter},ConverterParameter={Binding ElementName=ComboBox_Amount_Unit,Path=SelectedIndex}, Mode=TwoWay />
<ComboBox x:Name="ComboBox_Amount_Unit" }" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...