BindingMode.TwoWay не работает с UserControl (не обновлять свойство источника) - PullRequest
2 голосов
/ 28 февраля 2012

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

Ниже приведен код для моего пользовательского элемента управления

RestrictedBox.xaml

<UserControl.Resources>
        <Converters:EnumToVisibilityConverter  x:Key="enumToVisibilityConverter" />
        <Converters:EnumToVisibilityConverterReverse x:Key="enumToVisibilityConverterReverse" />
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="Transparent" >
        <StackPanel>
            <TextBox x:Name="txtTextBox" Width="50" Height="25" />
            <PasswordBox x:Name="txtPasswordBox" Width="50" Height="25" />
        </StackPanel>
    </Grid>

RestrictedBox.xaml.cs

public partial class RestrictedBox : UserControl
    {
        public RestrictedBox()
        {
            InitializeComponent();
            txtTextBox.SetBinding(TextBox.TextProperty, new Binding { Source = this, Path = new PropertyPath("Value"), Mode = BindingMode.TwoWay });
            txtTextBox.SetBinding(TextBox.VisibilityProperty, new Binding("Type")
                {
                    Source = this,
                    Converter = new EnumToVisibilityConverter()
                });
            txtPasswordBox.SetBinding(PasswordBox.PasswordProperty, new Binding { Source = this, Path = new PropertyPath("Value"), Mode = BindingMode.TwoWay });
            txtPasswordBox.SetBinding(TextBox.VisibilityProperty, new Binding("Type")
            {
                Source = this,
                Converter = new EnumToVisibilityConverterReverse()
            });
        }
        public string Value
        {
            get { return (string)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }
        public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(string), typeof(RestrictedBox), new PropertyMetadata("", ValueChanged));
        private static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }
        public Mode Type
        {
            get { return (Mode)GetValue(TypeProperty); }
            set { SetValue(TypeProperty, value); }
        }
        public static readonly DependencyProperty TypeProperty = DependencyProperty.Register("Type", typeof(Mode), typeof(RestrictedBox), new PropertyMetadata(Mode.Text, TypeChanged));
        private static void TypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }
    }

Ниже приведеныкод для LoginView, где я использовал свой пользовательский элемент управления (RestrictedBox).

LoginView.xaml

<control:RestrictedBox Type="Text" Value="{Binding Path=UserName}" />

LoginView.xaml.cs

 [Export(typeof(LoginView))]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public partial class LoginView : UserControl, IPageTitle
    {
        #region Constuctors
        public LoginView()
        {
            InitializeComponent();
        }
        [Import]
        public LoginViewModel ViewModel
        {
            get
            {
                return this.DataContext as LoginViewModel;
            }
            set
            {
                DataContext = value;
            }
        }
        #endregion
}

LoginViewModel.cs

[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class LoginViewModel : INotifyPropertyChanged, IRegionMemberLifetime
{
    private string _UserName = "";
    public string UserName
    {
        get { return _UserName; }
        set
        {
            _UserName = value;
            OnPropertyChanged("UserName");
        }
    }
    [ImportingConstructor]
    public LoginViewModel(IEventAggregator eventAggregator, IRegionManager regionManager)
    {
    }
}

Пожалуйста, помогите мне решить эту проблему, потому что я пытаюсь решить с прошлых 1,5 днейбез удачи.

Ваши комментарии и предложения будут высоко оценены.

Примечание: - Я могу связать значениеимя пользователя для TextBox, но я обновляю TextBox и нажимаю на кнопку «Отправить», я не могу получить обновленное значение из TextBox.

Спасибо,

Имдадхусен

1 Ответ

2 голосов
/ 29 февраля 2012

Вам не хватает Mode = TwoWay в вас LoginView.xaml:

<control:RestrictedBox Type="Text" Value="{Binding Path=UserName,Mode=TwoWay}" />
...