DependencyProperty Silverlight UserControl

时间:2014-03-05 16:59:24

标签: c# silverlight user-controls dependency-properties

我已经阅读了一些关于此的文章,我无法看到我在这里做错了什么可以帮助:)

我有一个名为CreateRuleItemView的UserControl我想在这里添加一个Dependency Property,我也可以绑定我的ViewModel。到目前为止,我有。

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

    public Boolean ShowEditTablePopup
    {
        get
        {

            return (Boolean)this.GetValue(ShowEditTablePopupProperty);
        }
        set
        {

            this.SetValue(ShowEditTablePopupProperty, value);
        }
    }

    public static readonly DependencyProperty ShowEditTablePopupProperty = DependencyProperty.Register("ShowEditTablePopup", typeof(Boolean), typeof(CreateRuleItemView), new PropertyMetadata(null, OnShowEditTablePopupChanged));

    private static void OnShowEditTablePopupChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
    }

    }

}

如果我然后尝试访问用户控件Xaml中的属性,我得到:

<UserControl x:Class="Views.Setup.CreateRuleItemView"
    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"
    d:DataContext="{d:DesignInstance Type=vm:CreateRuleItemViewModel, IsDesignTimeCreatable=False}"         
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" ShowEditTablePopup="{Binding DataContext.ShowEditTablePopup}" >

错误1无法识别或无法访问成员“ShowEditTablePopup”。

错误3“UserControl”类型中不存在“ShowEditTablePopup”属性

错误2在“UserControl”类型中找不到属性“ShowEditTablePopup”。

修改1 : 好管理通过在我设置我的视图的主窗口后面的代码中添加绑定来解决这个问题。

Setup.CreateRuleItemView v = new Setup.CreateRuleItemView();  
BindingOperations.SetBinding(v, CreateRuleItemView.EditTablePopupProperty, new Binding("EditTablePopup"));

1 个答案:

答案 0 :(得分:0)

您将无法使用UserControl实现此目的(我刚刚在本地重新创建代码时尝试用<UserControl...替换XAML中的<local:CreateRuleItemView部分声明,但是这样导致循环引用,因此不会编译/可能导致XamlParseException)。我写了一个继承自ContentControl的控件,你可以在其中添加属性和模板(我用WPF做了这个,所以命名空间可能不同,否则代码会起作用):

using System;
using System.Windows;
using System.Windows.Controls;

namespace DepPropTest
{
    /// <summary>
    /// Description of CreateRuleItemView.
    /// </summary>
    public class CreateRuleItemView : ContentControl
    {
        public CreateRuleItemView()
        {
        }

        public static readonly DependencyProperty ShowEditTablePopupProperty = 
            DependencyProperty.Register("ShowEditTablePopup", typeof (bool), typeof (CreateRuleItemView), new PropertyMetadata());

        public bool ShowEditTablePopup
        {
            get { return (bool) GetValue(ShowEditTablePopupProperty); }
            set { SetValue(ShowEditTablePopupProperty, value); }
        }

    }
}

然后您可以按如下方式使用它(此示例使用WPF,因此Window是父控件):

<Window x:Class="DepPropTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DepPropTest"
    Title="DepPropTest" Height="300" Width="300">

    <local:CreateRuleItemView Width="300"
                              Height="300"
                              ShowEditTablePopup="True">
        <local:CreateRuleItemView.Template>
            <ControlTemplate>
                <!-- define your control's visual appearance... -->
            </ControlTemplate>
        </local:CreateRuleItemView.Template>

        <TextBox Text="Some content for your view" />
    </local:CreateRuleItemView>
</Window>