Динамическое связывание с пользовательским контролем не работает, так как Static работает в Silverlight и MVVM - PullRequest
3 голосов
/ 27 февраля 2012

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

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 ( Следующая строка не работает с привязкой )

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

Это работает ( со статическим связыванием )

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

Спасибо, Imdadhusen

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

На самом деле это должно работать.Можете ли вы проверить, что DataContext родительского контейнера нижестоящего элемента управления не ссылается ни на какое другое свойство viewmodel.

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

например.Нечто подобное ниже.

<StackPanel DataContext={Binding CurrentUser}>

<control:RestrictedBox Value="{Binding UserName}"

 Type="Text" />

</StackPanel>

Может быть, это поможет вам ....

2 голосов
/ 02 марта 2012

У меня есть решение от следующих

http://forums.silverlight.net/t/250206.aspx/1?Dynamic+binding+with+User+Control+does+not+work+as+Static+is+working+in+Silverlight+and+MVVM

Спасибо всем, кто пытается мне помочь. Imdadhusen

...