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

您只能将 ObservableCollection 绑定到期望它的控件,例如 ListBox 或 LongListSelector。此外,将 Brush 添加到 TestCollection 不会触发非功能性通知,因为它不会调用该属性的设置器,只是修改现有对象。

使 TestCollection 成为一种类型ColorClass并更改.Add内容以仅更改ColorClass.ControlForeground属性,这应该“正常工作”。

于 2013-05-19T01:13:35.900 回答
1

对于您的第二个问题(无法在数据模板中绑定控件),这是因为这些控件将使用其父模板的数据上下文而不是页面的数据上下文。

要解决此问题,您必须将元素名称与数据上下文告知这些控件,并为其提供属性的完整路径。

<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 回答