C# WP7:UserControl的绑定问题

C# WP7:UserControl的绑定问题,c#,windows-phone-7,user-controls,C#,Windows Phone 7,User Controls,当我开发我的应用程序时,我发现我创建“平铺”控件的频率太高了。因此,我目前正试图将其移动到一个用户控件中以供重用。但是,它目前不接受以前工作的任何绑定。例如: 可以很好地使用绑定 产生错误“参数不正确” 以下是my Tile UserControl的代码: Tile.xaml Tile.xaml.cs namespace RSS\u Alarm.Views { 公共部分类磁贴:UserControl { 公共瓷砖() { 初始化组件(); } 公共字符串图标 { 得到 { 返回img

当我开发我的应用程序时,我发现我创建“平铺”控件的频率太高了。因此,我目前正试图将其移动到一个用户控件中以供重用。但是,它目前不接受以前工作的任何绑定。例如:


可以很好地使用绑定


产生错误“参数不正确”

以下是my Tile UserControl的代码:

Tile.xaml


Tile.xaml.cs

namespace RSS\u Alarm.Views
{
公共部分类磁贴:UserControl
{
公共瓷砖()
{
初始化组件();
}
公共字符串图标
{
得到
{
返回imgIcon.Source.ToString();
}
设置
{
BitmapImage alarmIcon=新建BitmapImage();
alarmIcon.UriSource=新Uri(值,UriKind.Relative);
imgIcon.Source=报警图标;
}
}
新公共画笔背景
{
得到
{
返回背景。填充;
}
设置
{
rectBackground.Fill=值;
}
}
新公众双高
{
得到
{
返回背景。高度;
}
设置
{
rectBackground.Height=值;
imgIcon.高度=值*0.8;
}
}
新公共双宽度
{
得到
{
返回背景宽度;
}
设置
{
矩形背景。宽度=值;
imgIcon.宽度=值*0.8;
}
}
}
}
如果你需要更多的信息来源,请告诉我,我会发布。使用固定值时,我没有任何问题(
高度
宽度
都可以,如果我将
背景
设置为红色,则也可以),但更改为绑定值会引发异常


编辑1

以下是一些更新的代码:

Tile.xaml.cs

#区域背景
公共静态只读从属属性RectBackgroundProperty=
从属属性。寄存器(
“背景”,
类型(SolidColorBrush),
类型(瓷砖),
新PropertyMetadata(新SolidColorBrush(Colors.Green)、新PropertyChangedCallback(OnBackgroundChanged))
);
BackgroundChanged上的公共静态无效(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
Debug.WriteLine(“填充背景”);
((Tile)d).rectBackground.Fill=(Brush)e.NewValue;
}
新公共色刷背景
{
获取{return(SolidColorBrush)GetValue(RectBackgroundProperty);}
集合{
调试写入线(“设置颜色”);
SetValue(RectBackgroundProperty,value);
}
}
#端区
MainMenuControl.xaml.cs

//用于确定图标背景颜色的类(活动/非活动)
公共类IconBackground:System.Windows.Data.IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
bool b=(bool)值;
Debug.WriteLine(“转换color.Value为”+b.ToString());
如果(b)
{
返回(刷)App.Current.Resources[“PhoneAccentBrush”];
}
其他的
{
返回新的SolidColorBrush(Colors.DarkGray);
}
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
SolidColorBrush=(SolidColorBrush)值;
if(brush.Color.Equals(Colors.DarkGray))
{
返回false;
}
其他的
{
返回true;
}
}
}
我也同时比较了这两种方法。左侧的互动程序是定义的画布,绑定完全可用,而右侧的互动程序是互动程序用户控件,它仅适用于定义的颜色(本例中为蓝色)


为了能够在XAML中绑定,仅创建属性是不够的。你必须创建一个新的

Background
绑定工作的原因是
UserControl
本身具有此属性。如果在
Background
属性设置器中设置断点,您将看到它从未被调用

以下是您的
背景
(未测试)的
从属属性
示例


关于这一点,你有什么可以推荐的教程吗?到目前为止,我试图实现这一点的尝试都没有成功。请参阅编辑,对于其他属性,您只需更改图标的名称和排版即可。仍在尝试使其与后台一起工作。对于后台,您并不真正需要它,因为usercontrol仍然具有此属性。只需从XAML中删除rectBackground删除rectBackground并使用UserControl的内置后台属性就行了。有趣的是,如果我将属性重命名为TileBG并使用定义的颜色,rectBackground方法可以很好地工作。然而,它仍然落在绑定上。有关我的当前代码,请参见编辑1。
#region Background
        public const string BackgroundPropertyName = "Background";
        public new Brush Background
        {
            get { return (Background)GetValue (BackgroundProperty); }
            set { SetValue (Background, value); }
        }
        public static new readonly DependencyProperty BackgroundProperty = DependencyProperty.Register (
            BackgroundPropertyName,
            typeof (Brush),
            typeof (Tile),
            new PropertyMetadata (BackgroundChanged));

        static void BackgroundChanged (DependencyObject d, DependencyPropertyChangedEventArgs e)
        {                
            ((Tile) d).rectBackground = (Brush)e.NewValue;    
        }
    #endregion