Search code examples
data-bindingmvvmsilverlight-4.0user-controlsprism-4

Dynamic binding with User Control does not work as Static is working in Silverlight and MVVM


I have created sample User Control

RestrictedBox.xaml

 <UserControl.Resources>
        <Converters:EnumToVisibilityConverter x:Key="enumToVisConverter" />
        <Converters:EnumToVisibilityConverterReverse x:Key="enumToVisConverterReverse" />
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White" Width="Auto">
        <StackPanel Margin="0">
            <TextBox Text="{Binding Value}" Visibility="{Binding Type,Converter={StaticResource enumToVisConverter}}" BorderBrush="Green" />
            <PasswordBox Password="{Binding Value}" Visibility="{Binding Type,Converter={StaticResource enumToVisConverterReverse}}" BorderBrush="Red" />
        </StackPanel>
    </Grid>

RestrictedBox.xaml.cs

public partial class RestrictedBox : UserControl
    {
        public RestrictedBox()
        {
            InitializeComponent();
            //If i bind static value and uncomment following line then it is working.
            //If i bind static value and comment following line then it is not working
            this.DataContext = this;
            //Dynamic binding does not work using this code.  
        }

        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(TypeChanged));
        private static void TypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }
    }

LoginViewModel.cs

public class LoginViewModel : INotifyPropertyChanged, IRegionMemberLifetime
{
        private string _UserName = "Imdadhusen Sunasara";
        public string UserName
        {
            get { return _UserName; }
            set
            {
                _UserName = value;
                OnPropertyChanged("UserName");
            }
        }
}

LoginView.xaml (This following line does not work with binding)

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

This is working (with static binding)

<control:RestrictedBox Value="Imdadhusen" Type="Text" />

Thanks, Imdadhusen


Solution

  • Actually It should work. Can you please verify that the DataContext of parent container of below control doesn't refering to any other property of viewmodel.

    <control:RestrictedBox Value="Imdadhusen" Type="Text" />
    

    eg. Something like below.

    <StackPanel DataContext={Binding CurrentUser}>
    
    <control:RestrictedBox Value="{Binding UserName}"
    
     Type="Text" />
    
    </StackPanel>
    

    May be this help you....