2012-05-03 54 views
0

当我开发我的应用程序时,我发现我经常重新创建“tile”控件。因此,我正在尝试将其移入用户控件以供重新使用。但是,它目前不接受之前工作的任何绑定。因此,例如:WP7:UserControl的绑定问题

​​

正常工作与绑定,

<views:Tile Height="73" Width="73" Background="{Binding Path=Active, Converter={StaticResource IconBackground}, Mode=OneWay}" Icon="{Binding Path=Tone.Image, Mode=OneTime}" /> 

产生错误 “的参数不正确”。

这里是我的瓷砖用户控件的代码:

Tile.xaml

<UserControl x:Class="RSS_Alarm.Views.Tile" 
    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" 
    FontFamily="{StaticResource PhoneFontFamilyNormal}" 
    FontSize="{StaticResource PhoneFontSizeNormal}" 
    Foreground="{StaticResource PhoneForegroundBrush}" 
    d:DesignHeight="100" d:DesignWidth="100"> 

    <Grid x:Name="LayoutRoot"> 
     <Canvas Height="100" Width="100" Margin="0,0,0,0"> 
      <Rectangle Name="rectBackground" Height="100" Width="100" /> 
      <Image Name="imgIcon" Height="80" Width="80" VerticalAlignment="Center" HorizontalAlignment="Center" Canvas.Left="10" Canvas.Top="10" /> 
     </Canvas> 
    </Grid> 
</UserControl> 

Tile.xaml.cs

namespace RSS_Alarm.Views 
{ 
    public partial class Tile : UserControl 
    { 
     public Tile() 
     { 
      InitializeComponent(); 
     } 

     public String Icon 
     { 
      get 
      { 
       return imgIcon.Source.ToString(); 
      } 

      set 
      { 
       BitmapImage alarmIcon = new BitmapImage(); 
       alarmIcon.UriSource = new Uri(value, UriKind.Relative); 
       imgIcon.Source = alarmIcon; 
      } 

     } 

     new public Brush Background 
     { 
      get 
      { 
       return rectBackground.Fill; 
      } 

      set 
      { 
       rectBackground.Fill = value; 
      } 
     } 

     new public double Height 
     { 
      get 
      { 
       return rectBackground.Height; 
      } 

      set 
      { 
       rectBackground.Height = value; 
       imgIcon.Height = value * 0.8; 
      } 
     } 

     new public double Width 
     { 
      get 
      { 
       return rectBackground.Width; 
      } 

      set 
      { 
       rectBackground.Width = value; 
       imgIcon.Width = value * 0.8; 
      } 
     } 
    } 
} 

如果您需要更多的来源,让我知道,我会发布它。使用固定值时,我没有任何问题(HeightWidth很好,如果我将Background设置为红色,那么也可以正常工作),但更改为绑定值会引发异常。


编辑1

下面是一些更新的代码:

Tile.xaml.cs

#region Background 
     public static readonly DependencyProperty RectBackgroundProperty = 
      DependencyProperty.Register(
       "RectBackground", 
       typeof(SolidColorBrush), 
       typeof(Tile), 
       new PropertyMetadata(new SolidColorBrush(Colors.Green), new PropertyChangedCallback(OnBackgroundChanged)) 
      ); 

     public static void OnBackgroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      Debug.WriteLine("Filling background"); 
      ((Tile)d).rectBackground.Fill = (Brush)e.NewValue; 
     } 

     new public SolidColorBrush Background 
     { 
      get { return (SolidColorBrush)GetValue(RectBackgroundProperty); } 
      set { 
       Debug.WriteLine("Setting colour"); 
       SetValue(RectBackgroundProperty, value); 
      } 
     } 
#endregion 

MainMenuControl.xaml.cs

// Class to determine the background colour of the icon (active/inactive) 
public class IconBackground : System.Windows.Data.IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool b = (bool)value; 

     Debug.WriteLine("Converting colour. Value is " + b.ToString()); 

     if (b) 
     { 
      return (Brush)App.Current.Resources["PhoneAccentBrush"]; 
     } 
     else 
     { 
      return new SolidColorBrush(Colors.DarkGray); 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     SolidColorBrush brush = (SolidColorBrush)value; 

     if (brush.Color.Equals(Colors.DarkGray)) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 
    } 

} 

我还在并排比较这两种方法。左边的瓦片是定义画布绑定的全面工作,而右边的瓷砖是瓷砖用户控件,它只能与定义的颜色作品(蓝在这种情况下)

Screenshot

回答

2

为了能够绑定在XAML中是不够的,使一个属性。您必须创建一个DependencyProperty

您的Background绑定工作原因是UserControl本身具有此属性。如果你在你的Background属性设置器中设置了一个断点,你会发现它永远不会被调用。

这里是一个DependencyProperty为您Background(未测试)

#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 
+0

您可以在此推荐任何教程的例子吗?到目前为止,我尝试实现这一目标一直没有成功。 –

+0

请参阅编辑,其他属性只需更改名称和类型 – thumbmunkeys

+0

它适用于图标。仍然试图让它与背景一起工作。 –