Повторное использование привязок и поведения xaml, которые являются общими для нескольких элементов управления (UWP) - PullRequest
0 голосов
/ 31 мая 2018

У меня есть несколько TextBox, которые используют идентичные привязки и поведения.Есть ли способ установить их в стиле текстового поля или в шаблоне или в каком-либо другом творческом решении, чтобы иметь повторяемые привязки и / или поведения для нескольких элементов управления xaml?

Вот пример того, что я делаю, вы можетевидим, что поведение одинаковое, у меня есть много TextBox, которые будут нуждаться в поведении команды validate, и привязка текста будет одинаковой для каждого элемента управления за исключением параметра Converter, но я могу связать это либо с именем элемента управления, либо с тегом.

<TextBox x:Name="Control1"
                 Text="{x:Bind NewItem.Params,Mode=TwoWay,Converter={StaticResource DictionaryConverter},ConverterParameter=Control1,UpdateSourceTrigger=PropertyChanged}"
                 AllowFocusOnInteraction="True" 
                 Style="{StaticResource FormTextBox}" 
                 Grid.Row="1">
            <i:Interaction.Behaviors>
                <ic:EventTriggerBehavior EventName="LostFocus">
                    <ic:InvokeCommandAction Command="{x:Bind NewItem.CommandValidate}"/>
                </ic:EventTriggerBehavior>
            </i:Interaction.Behaviors>
        </TextBox>

<TextBox x:Name="Control2"
                 Text="{x:Bind NewItem.Params,Mode=TwoWay,Converter={StaticResource DictionaryConverter},ConverterParameter=Control2,UpdateSourceTrigger=PropertyChanged}"
                 Style="{StaticResource FormTextBoxNumber}"
                 Grid.Row="4">
            <i:Interaction.Behaviors>
                <ic:EventTriggerBehavior EventName="LostFocus">
                    <ic:InvokeCommandAction Command="{x:Bind NewItem.CommandValidate}"/>
                </ic:EventTriggerBehavior>
            </i:Interaction.Behaviors>
        </TextBox>

Для тех из вас, кто всегда запутывается в моих вопросах и расшвыривает неправильные деревья, я постараюсь повторить все, что могу: каков простой / творческий способ повторного использования xamlпривязки и поведения, которые являются общими для нескольких элементов управления?

1 Ответ

0 голосов
/ 31 мая 2018

По вашему требованию вы можете использовать UserControl для инкапсуляции TextBox, которые блокируют больше деталей.Для удобства тестирования я упростил ваш код.И это мой UserControl, который содержит только TextBox.

<UserControl
    x:Class="BindTest.MyUseerControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:BindTest"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:i="using:Microsoft.Xaml.Interactivity"
    xmlns:ic="using:Microsoft.Xaml.Interactions.Core"
    d:DesignHeight="300"
    d:DesignWidth="400">

    <TextBox x:Name="MyTextBox" Text="{x:Bind Source.Params,Mode=TwoWay}"  AllowFocusOnInteraction="True"  Height="44">
        <i:Interaction.Behaviors>
            <ic:EventTriggerBehavior EventName="LostFocus">
                <ic:InvokeCommandAction Command="{x:Bind Source.CommandValidate}"/>
            </ic:EventTriggerBehavior>
        </i:Interaction.Behaviors>
    </TextBox>
</UserControl>

И затем я объявил Source DependencyProperty, который используется для хранения источника данных.

public Info Source
{   
    get { return (Info)GetValue(SourceProperty); }
    set { SetValue(SourceProperty, value); }
}

public static readonly DependencyProperty SourceProperty =
    DependencyProperty.Register("Source", typeof(Info), typeof(MyUseerControl), new PropertyMetadata(0));

Я такжесоздать Info класс модели.

public class Info
{
    public string Params { get; set; }
    public ICommand CommandValidate { get; set; }

    public Info()
    {
        this.Params = "Hi Nico";
        this.CommandValidate = new RelayCommand(()=> {

            Debug.WriteLine("This Method Invoke");

        });
    }
}

Использование

public MainPage()
 {
     this.InitializeComponent();
     Item = new Info();
 }
public Info Item { get; set; }


<local:MyUseerControl Source="{x:Bind Item}"/>
...