0

かなり基本的なボタンを定義する XAMLがあります。 falseのときにオーバーレイ イメージを表示するUserControlBindable プロパティを定義したいと考えています。ただし、プロジェクトに含めてViewModelにバインドすると、一貫して更新されません。HasMeasurementsHasMeasurements

同じViewModelプロパティを別の別の要素に同時にバインドし、期待どおりに更新するため、ViewModelがバインディングを適切に通知していると確信しています。また、モック データを更新すると、Blend で動作します。

Visibility をプログラムで変更するコールバックを定義するこのソリューションを試しましたが、このコールバックは ViewModel プロパティが変更されるたびに呼び出されるのではなく、たまにしか呼び出されません。また、このソリューションと非依存プロパティを使用して 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); }
        }
    }
}
4

2 に答える 2

0

ああ、それはアントンの答えと、画像を「コンテンツ」として設定していなかったという事実の組み合わせであったため、Blend に読み込まれましたが、展開されたアプリには存在しませんでした。

于 2013-04-14T17:34:23.510 に答える