Silverlight: привязка свойства объекта ресурса - PullRequest
0 голосов
/ 24 июня 2010

Я пытаюсь привязать свойство объекта ресурса к элементу управления (комбо ...) - кажется, что это работает в конструкторе, но оно не работает во время выполнения. Просто используя простую страницу только с кнопкой и разделом со списком ресурсов:

<UserControl.Resources>
    <LinearGradientBrush x:Key="myBrush" EndPoint="1,0.5" StartPoint="0,0.5">
        <GradientStop Offset="0" Color="{Binding ElementName=w_comboColor, Path=SelectedItem.Content}" />
        <GradientStop  Offset="1" Color="White" />
    </LinearGradientBrush>
</UserControl.Resources>

и виджеты раздел:

<Button Name="w_button" Grid.Row="0" Width="200" Content="Button" Height="60" HorizontalAlignment="Center"
        Margin="2" VerticalAlignment="Center" Background="{Binding Source={StaticResource myBrush}}">
</Button>

<ComboBox Grid.Row="1" Height="24" HorizontalAlignment="Stretch" Margin="2"
          Name="w_comboColor" VerticalAlignment="Center" SelectedIndex="1" >
    <ComboBox.Items>
        <ComboBoxItem Content="Red" />
        <ComboBoxItem Content="Blue" />
        <ComboBoxItem Content="Green" />
    </ComboBox.Items>
</ComboBox>

При изменении значения свойства SelectedIndex комбо в конструкторе фон кнопки меняет свой цвет фона (как и ожидалось). Если я запускаю образец, ничего больше не работает: - \

Я пытался форсировать DataContext из UserControl и другие вещи - ничего не происходит: во время выполнения привязка нарушается. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

Привязки к объектам ресурсов игнорируются, когда эти объекты наследуются непосредственно от DependencyObject (как это делает GradientStop). Привязки работают с объектами ресурсов, которые наследуются от FrameworkElement.

0 голосов
/ 24 июня 2010

Вам необходимо добавить ValueConverter в привязку GradientStop.Color для преобразования из string в Color. Ваша текущая привязка пытается присвоить string свойству Color. Я предполагаю, что дизайнер сделает преобразование типов для вас, как это было бы в XAML, но этого не произойдет во время выполнения. Вам понадобится конвертер примерно так:

public class ColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(value == "Red")
            return Colors.Red;
        else if(value == "Blue")
            return Colors.Blue;
        else if(value == "Green")
            return Colors.Green;
    }
}

Это определенно не полный конвертер, но он должен указывать вам правильное направление.

...