Как изменить цвет объекта на основе значения привязки в Silverlight? - PullRequest
0 голосов
/ 21 марта 2011

Мне нужно изменить цвет фона границы на основе значения текстовой строки текстового блока из привязки.Я планировал использовать триггеры, но это не поддерживается в Silverlight.Я ищу любые советы о том, как это можно сделать в Silverlight.Заранее спасибо!

XAML:

<data:DataGridTemplateColumn Header="Y Position" Width="100">
                <data:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Border Background="Red" Width="10" Height="18" VerticalAlignment="Center" Margin="0,0,10,0" />
                            <TextBlock Text="{Binding Y}" VerticalAlignment="Center" />
                        </StackPanel>
                    </DataTemplate>
                </data:DataGridTemplateColumn.CellTemplate>
            </data:DataGridTemplateColumn>

Код модели представления:

public class MainPage_ViewModel : INotifyPropertyChanged 
{
    public 
    public MainPage_ViewModel()
    {
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 1, Y = 2 }));         
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 2, Y = 4 }));         
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 3, Y = 6 }));         
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 4, Y = 8 }));         
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 5, Y = 10 }));         
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 6, Y = 12 }));
    }

    public ObservableCollection<Coordinate_DataViewModel> Coordinates     
    {         
        get { return coordinates; }         
        set          
        {             
            if (coordinates != value)             
            {                 
                coordinates = value;                 
                OnPropertyChanged("Coordinates");             
            }         
        }     
    }     
    private ObservableCollection<Coordinate_DataViewModel> coordinates = new ObservableCollection<Coordinate_DataViewModel>();      
    public event PropertyChangedEventHandler PropertyChanged;      

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

    public void DeleteCoordinate(Coordinate_DataViewModel dvmToDelete)     
    {         
        coordinates.Remove(dvmToDelete);     
    }

    public void UpdateCoordinate(Coordinate_DataViewModel dvmToDelete)
    {

    }
}

//Model
public class Coordinate_Model 
{     
    public double X;     
    public double Y; 
} 

//DataViewModel
public class Coordinate_DataViewModel 
{     
    public Coordinate_DataViewModel(Coordinate_Model model)     
    {         
        this.underlyingModel = model;     
    }     

    private Coordinate_Model underlyingModel;      
    public double X     
    {         
        get { return underlyingModel.X; }         
        set { underlyingModel.X = value; }     
    }      

    public double Y     
    {         
        get { return underlyingModel.Y; }         
        set { underlyingModel.Y = value; }     
    }      public string XYCoordinate     

    {         
        get { return "(" + X + "," + Y + ")"; }     
    } 
} 

Ответы [ 3 ]

8 голосов
/ 21 марта 2011

Я не очень-то люблю вставлять цвета в вашу модель. На мой взгляд, лучше использовать конвертер, например, так:

public class CoordinateToColorConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        return new SolidColorBrush((int) value == 2 ? Colors.Red : Colors.Black);
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    #endregion
}

затем вы можете определить свою привязку следующим образом:

                    <Border Background="{Binding Y, Converter={StaticResource CoordinateToColorConverter}}" Width="10" Height="18" VerticalAlignment="Center" Margin="0,0,10,0" />
2 голосов
/ 21 марта 2011

Недавно я обсуждал это с кем-то еще.Я лично использовал технику, предоставленную Люком Босом, но есть другая техника: RYODTS или Roll Your Own DataTemplateSelector.

Это можно сделать с относительно небольшими усилиями.Пример можно найти на CodeProject .

1 голос
/ 21 марта 2011

если вы используете модель разработки MVVM, то вы должны сделать что-то вроде:

<Border Background="{Binding BackgroundColor}" ...

... и создать свойство в вашей модели представления, которое предоставляет цветовую кистьты хочешь.Тогда вся логика принятия решения об этом цвете границы может находиться рядом с вашими данными.

public double Y     
    {         
        get { return underlyingModel.Y; }         
        set { underlyingModel.Y = value; 
              // here, test underlyingModel.Y, and 
              // set backgroundColor private property, and 
              // raise the PropertyChanged event on "BackgroundColor" 
            }     
    }     

private Brush backgroundColor;
public Brush BackgroundColor { 
        get { return backgroundColor; }
        set { // whatever you want to do here, probably just  
              backgroundColor=value; 
              OnPropertyChanged("BackgroundColor")};
            }
        }
...