2013-04-14 78 views
0

我有一個XAML UserControl,它定義了一個相當基本的按鈕 - 我想定義一個Bindable屬性HasMeasurements,當HasMeasurements爲false時,將顯示重疊圖像。但是,當我將它包含在我的項目中並將其綁定到ViewModel時,它不會一致地更新。綁定不能在Windows Phone 7自定義用戶控件上工作

我相信ViewModel正確地通知綁定,因爲我已經將同一個ViewModel屬性同時綁定到另一個單獨的元素,並且按預期進行更新。當我更新模擬數據時它也適用於Blend。

我試過this solution,它定義了一個回調函數,我用編程方式改變可視性,但是這個回調函數在每次ViewModel屬性改變時都不會被調用,只是有時候。我也嘗試使用this solution綁定XAML中的可見性和非依賴項屬性,該屬性也無效。我也曾嘗試推行NotifyPropertyChanged出於絕望,但沒有運氣要麼...

這裏是我的XAML,

<UserControl x:Class="MyApp.View.Controls.ConversionBtn" 
    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" 
    xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit" 
    mc:Ignorable="d" 
    FontFamily="{StaticResource PhoneFontFamilyNormal}" 
    FontSize="{StaticResource PhoneFontSizeNormal}" 
    Foreground="{StaticResource PhoneForegroundBrush}" 
    d:DesignHeight="480" d:DesignWidth="480"> 

    <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}"> 

     <Grid x:Name="btnGrid" toolkit:TiltEffect.IsTiltEnabled="True" Height="115"> 
      <Border Background="{StaticResource ImgOverlayColor}" BorderThickness="0" Padding="0" VerticalAlignment="Top" > 
       <TextBlock x:Name="titleTxtBlock" FontSize="{StaticResource PhoneFontSizeMedium}" Foreground="{StaticResource TileTxtColor}" Margin="6,0,0,0"/> 
      </Border> 
      <Image x:Name="notAvailableImg" Source="/Images/ConversionNotAvailableOverlay.png" HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="None" /> 
     </Grid> 

    </Grid> 
</UserControl> 

這裏是後面的代碼,

// usings here ... 

namespace MyApp.View.Controls 
{ 
    public partial class ConversionBtn : UserControl 
    { 
     public ConversionBtn() 
     { 
      InitializeComponent(); 

      if (!TiltEffect.TiltableItems.Contains(typeof(ConversionBtn))) 
       TiltEffect.TiltableItems.Add(typeof(ConversionBtn)); 

      //this.DataContext = this; 
     }  

     public string Title 
     { 
      get { return this.titleTxtBlock.Text; } 
      set { this.titleTxtBlock.Text = value; } 
     } 

     public static readonly DependencyProperty HasMeasurementsProperty = 
      DependencyProperty.Register("HasMeasurements", typeof(bool), typeof(ConversionBtn), 
      new PropertyMetadata(false, new PropertyChangedCallback(HasMeasurementsPropertyChanged))); 

     private static void HasMeasurementsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      ConversionBtn cBtn = (ConversionBtn)d; 
      bool val = (bool)e.NewValue; 
      if (val) 
      { 
       cBtn.notAvailableImg.Visibility = Visibility.Collapsed; 
      } 
      else 
      { 
       cBtn.notAvailableImg.Visibility = Visibility.Visible; 
      } 
      cBtn.HasMeasurements = val; 

     } 

     public bool HasMeasurements 
     { 
      get { return (bool)GetValue(HasMeasurementsProperty); } 
      set { SetValue(HasMeasurementsProperty, value); } 
     } 
    } 
} 

回答

1

你有一個回調,這是HasMeasurment propetry被改變後調用。

而在回調中,您再次更改它。所以,你有一個合乎邏輯的誤會。

如果你需要用這個值做點什麼 - 只要把它保存在私人領域。

private static void HasMeasurementsPropertyChanged(DependencyObject d, 
DependencyPropertyChangedEventArgs e) 
       { 
        ConversionBtncBtn = (ConversionBtn)d; 
        bool val = (bool)e.NewValue; 
        if (val) 
        { 
         cBtn.notAvailableImg.Visibility = Visibility.Collapsed; 
        } 
        else 
        { 
         cBtn.notAvailableImg.Visibility = Visibility.Visible; 
        } 
        cBtn.SetMeasurments(val); 

       } 

      private bool measurmentsState; 
      public void SetMeasurments(bool value) 
      { 
       measurmentsState = value; 
      } 

Here您可以通過CHARLS Petzold的有關Windows Phone開發得到免費的電子書,有大約依賴屬性一個不錯的篇章。

+0

感謝您的迴應,你說什麼是有道理的,(我正在複製[在這篇文章中的頂部答案]](http://stackoverflow.com/questions/6808670/windows-phone-7-silverlight-user-control - 數據綁定 - 不工作,在定製-PRO))。但是,刪除該行似乎沒有區別... – Brendan

0

Ah damnit,這是Anton的回答和我沒有將圖像設置爲「內容」的事實的組合,因此它在Blend中加載,但未出現在部署的應用程序中。

相關問題