2014-01-26 5 views
1

Я создал простой элемент управления Silverlight и определил общедоступное свойство AllowMultiple.Доступ к общедоступной функции управления пользователями silverlight в коде за кодом

public bool AllowMultiple { get; set; }

Теперь я устанавливаю эту общественную собственность в XAML следующим образом:

<Controls1:PeopleChooser Name="SinglePeopleChooser" AllowMultiple="False" Width="Auto" d:LayoutOverrides="Height"/> 
<Controls1:PeopleChooser Name="MultiplePeopleChooser" AllowMultiple="True" Width="Auto" d:LayoutOverrides="Height"/> 

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

public PeopleChooser() 
{ 
    InitializeComponent();    

    if (AllowMultiple) 
    { 
     UsersListBox.Visibility = System.Windows.Visibility.Visible; 
     UserTextBox.Visibility = System.Windows.Visibility.Collapsed; 
     ResolveButton.Visibility = Visibility.Collapsed;    
    } 
    else 
    { 
     UsersListBox.Visibility = System.Windows.Visibility.Collapsed; 
     UserTextBox.Visibility = System.Windows.Visibility.Visible; 
     ResolveButton.Visibility = Visibility.Visible; 
    } 

} 

Возможно, потому что во время инициализации конструктора значение этого открытого свойства не было назначено инфраструктурой для объекта.

+2

Я думаю, что это должно быть свойство зависимости. –

ответ

1

Я смог решить это через загруженное событие. Нет необходимости в свойстве зависимостей. См. Код ниже. Я могу получить доступ к значению свойств успешно в событии Loaded.

public PeopleChooser() 
     { 

      this.Loaded += PeopleChooser_Loaded; 
      InitializeComponent();      

     } 


    void PeopleChooser_Loaded(object sender, RoutedEventArgs e) 
     { 
      if (AllowMultiple) 
      { 
       UsersListBox.Visibility = System.Windows.Visibility.Visible; 
       UserTextBox.Visibility = System.Windows.Visibility.Collapsed; 
       ResolveButton.Visibility = Visibility.Collapsed;    

      } 
      else 
      { 
       UsersListBox.Visibility = System.Windows.Visibility.Collapsed; 
       UserTextBox.Visibility = System.Windows.Visibility.Visible; 
       ResolveButton.Visibility = Visibility.Visible; 
      } 
+0

Я упомянул об этом в своем ответе ... Да, на самом деле это не требует dp. – Sankarann

+0

+1: Извинения за раннее замешательство по поводу ДП. Собирался опубликовать этот же ответ, но вы сами это поняли. –

1

Преобразование государственной собственности с Бекфилд,

private bool _allowMultiple; 
    public bool AllowMultiple 
    { 
     get { return _allowMultiple; } 
     set { _allowMultiple = value; } 
    } 

Поместите точку останова в инкубаторе и проверить, является он попадает в конструкторе, если вы не можете использовать Loaded событие, чтобы проверить то же самое и использовать что.

+0

@TrueBlueAussie: Да, это не так, но намерение - проверить, когда значение получает множество. так что он может получить значение соответственно. Кроме того, не обязательно, чтобы свойство зависимости устанавливало прямые значения. Для привязки это должно быть свойство зависимости. – Sankarann

+0

@TrueBlueAussie: Объяснение дано в вашем комментарии правильно .. и спасибо за ваше нижнее изображение с подробным объяснением ... – Sankarann

1

Если вы используете свойство зависимостей, вы можете связать другие элементы свойства к свойству AllowMultiple народа Chooser и использовать конвертер видимость, чтобы показать/скрыть их. Пример:

public partial class PeopleChooser : UserControl 
{ 
    public PeopleChooser() 
    { 
     InitializeComponent(); 
    } 

    public static readonly DependencyProperty AllowMultipleProperty = DependencyProperty.Register("AllowMultiple", typeof(bool), typeof(PeopleChooser), null); 
    public bool AllowMultiple 
    { 
     get { return (bool)GetValue(AllowMultipleProperty); } 
     set { SetValue(AllowMultipleProperty, value); } 
    } 
} 

<UserControl x:Class="TestSilverlightApplication.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400" 
    xmlns:lcl="clr-namespace:TestSilverlightApplication"> 
    <UserControl.Resources> 
     <lcl:VisibilityConverter x:Key="VisibilityConverter" /> 
    </UserControl.Resources> 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <StackPanel Orientation="Vertical"> 
      <Button Click="Button_Click" Content="Toggle allow multiple" /> 
      <lcl:PeopleChooser x:Name="lclPeopleChooser" AllowMultiple="False"></lcl:PeopleChooser> 
      <TextBlock Text="Dependent content" Visibility="{Binding AllowMultiple, ElementName=lclPeopleChooser, Converter={StaticResource VisibilityConverter}}" /> 
     </StackPanel> 

    </Grid> 
</UserControl> 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     lclPeopleChooser.AllowMultiple = !lclPeopleChooser.AllowMultiple; 
    } 

public class VisibilityConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool parsedValue = false; 
     bool.TryParse(value.ToString(), out parsedValue); 
     if (parsedValue) 
     { 
      return Visibility.Visible; 
     } 
     return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Таким образом, вы можете избежать событий страницы и потенциально связать свойство AllowMultiple на вид модели собственности и пусть UI заботиться о себе.