1

有一个实现 INotifyPropertyChanged 接口的类,如下所示:

public class ColorNotify : INotifyPropertyChanged
{   
    public event PropertyChangedEventHandler PropertyChanged;

    private SolidColorBrush bindableColor;
    public SolidColorBrush BindableColor
    {
        get { return bindableColor; }
        set
        {
            bindableColor = value;
            OnPropertyChanged("BindableColor");
        }
    }  

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));   
        } 
    } 
}

我的 MainPage.xaml.cs 中的字段之一是:

private ColorNotify DisabledColor; 

但我也尝试将上述字段作为属性,而不是像这样:

private ColorNotify disabledColor;
public ColorNotify DisabledColor
{
    get
    { return disabledColor; }
    set
    { disabledColor = value; }
}

MainPage.xaml.cs 中还有这个方法:

private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs Lgd_Refreshed_EvArgs)
{
    LayerItemViewModel layerItmViewMdl;
    ObservableCollection<LayerItemViewModel> layerItms;

    layerItmViewMdl = Lgd_Refreshed_EvArgs.LayerItem;
    Layer legendItemLyr = layerItmViewMdl.Layer; 

    if (!legendItemLyr.IsInitialized)
    { 
        DisabledColor = new ColorNotify();
        DisabledColor.BindableColor = new SolidColorBrush(Colors.Red);
    }
    ...
    ...
}

在 MainPage.xaml 我有这个:

<esri:Legend 
        Map="{Binding ElementName=theMap}"
        LayerIDs="..." 
        Refreshed="Legend_Refreshed">
               <esri:Legend.MapLayerTemplate>
                       <DataTemplate>
                              <StackPanel Orientation="Horizontal" Width="Auto">
                                        <CheckBox Content="{Binding Label}" 
                                            Width="Auto" 
                                            IsChecked="{Binding IsEnabled, Mode=TwoWay}"
                                IsEnabled="{Binding IsInScaleRange}" 
                                            Foreground="{Binding Source=DisabledColor, Path=BindableColor}">
                                        </CheckBox>
                                        <Slider Maximum="1"  
                                            Value="{Binding Layer.Opacity, Mode=TwoWay}" 
                                            Width="80" />
                              </StackPanel>
                       </DataTemplate>
...
...
...
</esri:Legend>

注意上面的 XAML 代码:

Foreground="{Binding Source=DisabledColor, Path=BindableColor}">

那没有用。

然后我在 XAML 中尝试了这个:

Foreground="{Binding BindableColor}"

但这也不起作用如何将 Foreground 绑定到 ColorNotify 类的 BindableColor 属性?绑定到 INotifyPropertyChanged 对象时,XAML 绑定应该是什么样子?(不通过 MVVM)

4

2 回答 2

1

编辑:基于下面的评论讨论,我认为你应该IValueConverter用这样的Convert方法创建一个:

return new SolidColorBrush((bool)value ? Colors.Black : Colors.Red);

假设您的IValueConverter类名为InitializedColorConverter,在您添加为 xmlns 的命名空间中local。在 XAML 中像这样使用它:

<UserControl.Resources>
    <local:InitializedColorConverter x:Key="InitializedColorConverter" />
</UserControl.Resources>
...
Foreground="{Binding IsInitialized, Converter = {StaticResource InitializedColorConverter}}"

结束编辑。我将把剩下的留在这里,因为它可能对有类似问题的人有用:

您需要将字段更改MainPage为公共属性:

public ColorNotify DisabledColor { get; private set; }

如果您希望绑定在DisabledColor自身发生更改时更新,请同时实现INotifyPropertyChangedon MainPage(和此属性)。

获得正确值绑定的一种更简单的方法是以编程方式进行。为此,请Loaded在您的对象上放置一个处理程序:

<CheckBox Content="{Binding Label}" 
          Width="Auto" 
          IsChecked="{Binding IsEnabled, Mode=TwoWay}"
          IsEnabled="{Binding IsInScaleRange}" 
          Loaded="MyCheckBoxLoaded">

并让您的处理程序执行以下操作:

private void MyCheckBoxLoaded(object sender, System.Windows.RoutedEventArgs e)
{
    var cb = (CheckBox)sender;
    cb.SetBinding(Control.ForegroundProperty,
new System.Windows.Data.Binding("DisabledColor.Bindablecolor") { Source = this });
}

它可能看起来令人费解的原因是Source需要成为您的MainPage,不幸的是,在 Silverlight 中,这并不像看起来那么容易。

如果您DisabledColor在页面的生命周期内永远不会更改,您可以将其保留为私有字段(标记它readonly以确保这是真的)并在处理程序中执行此操作:

cb.SetBinding(Control.ForegroundProperty,
new System.Windows.Data.Binding("Bindablecolor") { Source = this.DisabledColor });
于 2013-04-22T15:55:51.417 回答
0

如果你改变/初始化

private ColorNotify DisabledColor; 

在 View/ViewModel 加载之后,您需要将此属性更改为 public 并在其上实现 INotifyPropertyChange,就像您在 ColorNotify 上所做的一样。

于 2013-04-22T15:47:17.920 回答