首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在代码后面访问silverlight用户控件的公共属性

在代码后面访问silverlight用户控件的公共属性
EN

Stack Overflow用户
提问于 2014-01-26 21:05:27
回答 3查看 545关注 0票数 1

我创建了一个简单的Silverlight用户控件,并定义了一个公共属性AllowMultiple

public bool AllowMultiple { get; set; }

现在,我将XAML中的这个公共属性设置为:

代码语言:javascript
复制
<Controls1:PeopleChooser Name="SinglePeopleChooser" AllowMultiple="False" Width="Auto" d:LayoutOverrides="Height"/>
<Controls1:PeopleChooser Name="MultiplePeopleChooser" AllowMultiple="True" Width="Auto" d:LayoutOverrides="Height"/>

我想知道,这是我能得到这个公共财产价值的最好的事件。我试图在构造函数中获取这个值,并试图在我的用户控件中隐藏/显示一些控件,但它不起作用。

代码语言:javascript
复制
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;
    }

}

可能是因为在构造函数初始化期间,这个公共属性的值没有由框架分配给对象。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-27 10:15:47

我可以通过加载事件来解决这个问题。不需要依赖项属性。请看下面的代码。我可以在Loaded事件中成功地访问属性值。

代码语言:javascript
复制
 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;
            }
票数 1
EN

Stack Overflow用户

发布于 2014-01-27 07:19:36

用一个后场转换公共属性,

代码语言:javascript
复制
    private bool _allowMultiple;
    public bool AllowMultiple
    {
        get { return _allowMultiple; }
        set { _allowMultiple = value; }
    }

在setter中放置一个断点,并检查它是否击中了Constructor,如果没有,您可以使用Loaded事件进行检查并使用该事件。

票数 1
EN

Stack Overflow用户

发布于 2014-01-27 14:05:21

如果使用依赖项属性,则可以将其他元素属性绑定到人员选择器的AllowMultiple属性,并使用可见性转换器显示/隐藏这些属性。示例:

代码语言:javascript
复制
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自行处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21369190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档