OnPropertyChanged方法未触发

时间:2013-05-19 00:02:20

标签: c# xaml mvvm windows-phone

在WP8应用程序中,我有几个控件,我绑定前景色,我在代码隐藏中更改。但是当用户事件发生时,OnPropertyChanged没有触发。

我在我的textblock和radiobutton数据模板控件中定义了这个绑定“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)
            });
    }

}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

如上所示,您必须指定元素名称。如果您使用this.DataContext = colorClass绑定它,则元素名称将是您的xaml中外部网格的名称,默认为LayoutRoot