【问题标题】:Access public property of silverlight user control in code behind在后面的代码中访问 silverlight 用户控件的公共属性
【发布时间】:2014-01-26 21:05:27
【问题描述】:

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

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;
    }

}

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

【问题讨论】:

  • 我认为它必须是依赖属性。

标签: c# wpf silverlight silverlight-5.0


【解决方案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;
            }

【讨论】:

  • 我在回答中提到过...是的,它实际上不需要 dp。
  • +1:对于之前对 DP 的混淆表示歉意。正要发布同样的答案,但你自己想通了。
【解决方案2】:

用后场转换公共属性,

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

在设置器中放置一个断点并检查它是否命中构造函数,如果没有,您可以使用Loaded 事件来检查并使用它。

【讨论】:

  • @TrueBlueAussie:是的,它没有什么不同,但目的是检查值何时设置。这样他就可以相应地获得价值。此外,设置直接值不是必须是依赖属性。对于绑定,它需要是依赖属性。
  • @TrueBlueAussie:解释在您的评论中给出了正确的..感谢您对详细解释的反对...
【解决方案3】:

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

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 自行处理。

【讨论】:

    猜你喜欢
    • 2010-12-10
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多