UserControl: как преобразовать свойства зависимостей и связать их с результатом - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть XAML UserControl, комбинация Label, TextBox и ComboBox.В текстовом поле я набираю двойное значение, которое должно быть скорректировано с коэффициентом, определяемым моим выбором в ComboBox.Всегда!(На самом деле операция преобразования единиц: метры в километры, футы в сантиметры и т. Д.) Таким образом, у меня всегда будут единообразные единицы СИ "внутри" программы. Логическое место, которое можно сделать, - это внутренняя часть кода UserControl.Для этого я определяю Dep Prop InternalValue, которая будет содержать скорректированное значение текстового поля.Мне нужно иметь возможность привязываться к этому DP.
Я пытался сделать что-то вроде приведенного ниже кода, но это не сработает: я получаю указанную ошибку компиляции в TextChanged.Как я могу делать то, что я хочу?

        public string  TBText
    {
        get { return (string)GetValue(TBTextProperty); }
        set { SetValue(TBTextProperty, value); }
    }

    public static readonly DependencyProperty TBTextProperty =
        DependencyProperty.Register("TBText", typeof(string), typeof(UCInputField), new PropertyMetadata( new PropertyChangedCallback(TextChanged)));

    private static void TextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        InternalValue = Convert.ToDouble(e.NewValue) * factor; // error: an object reference is required.

    }

    public double InternalValue
    {
        get { return (double)GetValue(InternalValueProperty); }
        set { SetValue(InternalValueProperty, value); }
    }

    public static DependencyProperty InternalValueProperty =
        DependencyProperty.Register("InternalValue", typeof(double), typeof(UCInputField));


    public DimPostfix CBSelectedItem
    {
        get { return (DimPostfix)GetValue(CBSelectedItemProperty); }
        set { SetValue(CBSelectedItemProperty, value); }
    }

    public static readonly DependencyProperty CBSelectedItemProperty =
        DependencyProperty.Register("CBSelectedItem", typeof(DimPostfix), typeof(UCInputField),new PropertyMetadata(new PropertyChangedCallback(UnitChanged)));

    static double factor;
    private static void UnitChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        factor = (e.NewValue as DimPostfix).Factor;
    }

А вот UserControl:

    <UserControl
    x:Class="MyProgram.Views.UCInputField"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    d:DesignHeight="45"
    d:DesignWidth="250"
    mc:Ignorable="d">

    <StackPanel
        x:Name="LayoutRoot"
        Orientation="Horizontal">
        <Label      
            Content="{Binding LBContent}"
            Style="{StaticResource LabelStyle1}" />
        <TextBox
            x:Name="TB"
            HorizontalAlignment="Stretch"
            Text="{Binding TBText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        <ComboBox
            x:Name="CBBox"
            Width="70"
            DisplayMemberPath="Name"
            ItemsSource="{Binding CBUnit}"
            SelectedItem="{Binding CBSelectedItem}"/>
    </StackPanel>
    </UserControl>

И элемент управления будет использоваться так:

<ip:UCInputField
  CBSelectedItem="{Binding .....}"
  CBUnit="{Binding ....}"
  LBContent="Length"
  InternalValue="{Binding ...}"
  TBText="{Binding Path=Ucl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

1 Ответ

0 голосов
/ 16 декабря 2018

Как видите, TextChanged - статический метод.Таким образом, ему нужна ссылка на экземпляр вашего пользовательского элемента управления, если вы хотите изменить свойства там.Один из параметров метода имеет тип DependencyObject, который является объектом, которому принадлежит свойство зависимости, которое было изменено и может быть преобразовано в пользовательский элемент управления.

private static void TextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var myControl = (UCInputField)d; //This is the reference that is needed
        myControl.InternalValue = Convert.ToDouble(e.NewValue) * factor; //You can user factor since it is static
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...