0

WP8 アプリでは、分離コードで変更している前景色をバインドするコントロールがほとんどありません。しかし、ユーザー イベントが発生したときに OnPropertyChanged は起動しません。

このバインディング「ControlForeground」をテキストブロックとラジオ​​ボタン データ テンプレート コントロールで定義しました。ユーザーがボタンを押すたびに前景色を変更しようとしています。しかし、新しい色の割り当てが UI を更新していません。私がここに欠けているものはありますか?

XAML では、

<TextBlock x:Name="lblTileColor" TextWrapping="Wrap" Text="Selected color:" Foreground="{Binding ControlForeground, Mode=TwoWay}"/>
<TextBlock x:Name="lblTileColor2" TextWrapping="Wrap" Text="App bg:" Foreground="{Binding ControlForeground, Mode=TwoWay}"/>
<RadioButton x:Name="accentColor" IsChecked="true" BorderBrush="White" Foreground="{Binding ControlForeground, Mode=TwoWay}">
                    <RadioButton.ContentTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Rectangle Width="25" Height="25" Fill="{StaticResource PhoneAccentBrush}"/>
                                <TextBlock Width="10"/>
                                <TextBlock x:Name="lblDefaultAccent" Text="Default accent color" Foreground="{Binding ControlForeground, Mode=TwoWay}"/>
                            </StackPanel>
                        </DataTemplate>
                    </RadioButton.ContentTemplate>
                </RadioButton>

<Button x:name="UpdateColor" click="update_btn"/>

C# では、

public class ColorClass : INotifyPropertyChanged
{
    private SolidColorBrush _ControlForeground;
    public SolidColorBrush ControlForeground
    {
        get
        {
            return _ControlForeground;
        }

        set
        {
            _ControlForeground = value;
            OnPropertyChanged("ControlForeground");
        }
    }

    public ColorClass() { }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

public class ColorPage:PhoneApplicationPage{

    public ObservableCollection<ColorClass> TestCollection { get; private set; }

    public void update_btn(object sender, EventArgs e){
            TestCollection.Add(new ColorClass()
            {
                ControlForeground = new SolidColorBrush(Colors.Red)
            });
    }

}
4

2 に答える 2

1

2 番目の問題 (データ テンプレート内でコントロールをバインドできない) については、これらのコントロールがページのデータ コンテキストではなく、親テンプレートのデータ コンテキストを使用するためです。

これを修正するには、これらのコントロールにデータ コンテキストで要素名を伝え、プロパティのフル パスを指定する必要があります。

<TextBlock 
    x:Name="lblDefaultAccent" 
    Text="Default accent color" 
    Foreground="{Binding DataContext.ControlForeground, 
                         ElementName=LayoutRoot, Mode=TwoWay}"/>

上記のように、要素名を指定する必要があります。を使用してこれをバインドした場合this.DataContext = colorClass、要素名は xaml の外側のグリッドの名前になり、デフォルトで次のようになります。LayoutRoot

于 2013-05-19T05:04:50.173 に答える