Как реализовать логику в get, установить в свойстве зависимости WPF?

1

У меня есть пять элементов управления текстовыми полями в пользовательском элементе управления, поэтому я хочу добавить свойство зависимостей таким образом

    public string MyValue
    {
        get
        {
            return Textbox1.Text.Trim() + "." + Textbox2.Text.Trim() + "." + Textbox3.Text.Trim() + "." + Textbox4.Text.Trim() + "|" + Textbox5.Text.Trim();
        }
        set
        {

            Textbox1.Text = value.Split('|')[0];
            Textbox2.Text = value.Split('|')[1];
            Textbox3.Text = value.Split('|')[2];
            Textbox4.Text = value.Split('|')[3];
            Textbox5.Text = value.Split('|')[4];
        }

    }

Но это не работает. как создать свойство зависимостей, которое может быть привязано непосредственно к одному свойству. Любая помощь была бы благодарна.

  • 0
    это не работает не является полезным описанием.
  • 0
    Связывание не работает.
Показать ещё 3 комментария
Теги:
wpf
wpf-controls

1 ответ

1

Существует более одного решения:

  • выставить полную стоимость с помощью свойства и использовать IValueConverter для извлечения частей

  • создайте пять свойств, каждый из которых отображает часть полного значения

Оба они совместимы с MVVM, но второй может быть более прозрачным, избегая слишком большого количества сантехники, но вам может потребоваться больше уведомлений (INotifyPropertyChanged).


EDIT: полная реализация

UserControl:

XAML:

<UserControl x:Class="WpfApplication1.SplitterControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApplication1"
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <local:SplitConverter x:Key="splitConverter"></local:SplitConverter>
    </UserControl.Resources>
    <StackPanel x:Name="root" DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=MyValue,Mode=TwoWay,Converter={StaticResource splitConverter}}">
        <TextBox x:Name="Textbox1" Text="{Binding [0],NotifyOnSourceUpdated=True,UpdateSourceTrigger=PropertyChanged}" SourceUpdated="TextBox_SourceUpdated"></TextBox>
        <TextBox x:Name="Textbox2" Text="{Binding [1],NotifyOnSourceUpdated=True,UpdateSourceTrigger=PropertyChanged}" SourceUpdated="TextBox_SourceUpdated"></TextBox>
        <TextBox x:Name="Textbox3" Text="{Binding [2],NotifyOnSourceUpdated=True,UpdateSourceTrigger=PropertyChanged}" SourceUpdated="TextBox_SourceUpdated"></TextBox>
        <TextBox x:Name="Textbox4" Text="{Binding [3],NotifyOnSourceUpdated=True,UpdateSourceTrigger=PropertyChanged}" SourceUpdated="TextBox_SourceUpdated"></TextBox>
        <TextBox x:Name="Textbox5" Text="{Binding [4],NotifyOnSourceUpdated=True,UpdateSourceTrigger=PropertyChanged}" SourceUpdated="TextBox_SourceUpdated"></TextBox>
    </StackPanel>
</UserControl>

Код позади:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace WpfApplication1
{
    public partial class SplitterControl : UserControl
    {
        public string MyValue
        {
            get { return (string)GetValue(MyValueProperty); }
            set { SetValue(MyValueProperty, value); }
        }

        public static readonly DependencyProperty MyValueProperty = DependencyProperty.Register("MyValue", typeof(string), typeof(SplitterControl));        

        public SplitterControl()
        {
            InitializeComponent();
        }

        private void TextBox_SourceUpdated(object sender, DataTransferEventArgs e)
        {
            root.GetBindingExpression(DataContextProperty).UpdateSource();
        }
    }
}

IValueConverter:

using System;
using System.Globalization;
using System.Windows.Data;

namespace WpfApplication1
{
    public class SplitConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (value as string).Split('|');
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return string.Join("|", value as string[]);
        }
    }
}

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

<TextBox x:Name="input" Text="First|Second|Third|Fourth|Fifth"></TextBox>
    <local:SplitterControl MyValue="{Binding ElementName=input,Path=Text,Mode=TwoWay}"></local:SplitterControl>

Отредактируйте "input" TextBox чтобы изменить полное строковое значение и отредактировать каждый TextBox в UserControl чтобы изменить каждую часть.

Очень сложно, но нужно делать то, что вы хотите.

  • 0
    Так как это пользовательский элемент управления, я хочу представить его как одно свойство. когда я устанавливаю значение, оно должно появляться в разных текстовых полях, а когда я его получаю, оно должно объединять значения. (как указано выше)
  • 0
    @ user1487911 Я обновил свой ответ полной реализацией ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню