Стиль Silverlight и переплет - PullRequest
0 голосов
/ 23 мая 2011

У меня проблема с привязкой в ​​стиле silverlight.

Это моя модель:

public class MyObject
{
    public Uri TheUrl { get; set; }
    public string MyText { get; set; }
}

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public MyObject Object1 { get { return new MyObject { TheUrl = new Uri("test.png", UriKind.Relative), MyText = "Test1" }; } }
    public MyObject Object2 { get { return new MyObject { TheUrl = new Uri("test.png", UriKind.Relative), MyText = "Test2" }; } }
}

А это мой xaml:

    <UserControl.Resources>
    <Style x:Key="TestStyle" TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <StackPanel>
                        <TextBlock Text="{Binding MyObject.MyText}" />
                        <Image Source="{Binding MyObject.TheUrl}" />
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

<UserControl.DataContext>
    <vm:ViewModel />
</UserControl.DataContext>

<StackPanel x:Name="LayoutRoot" Background="White">
    <Button Style="{StaticResource TestStyle}" Width="100" Height="100" Tag="{Binding Object1}" />
    <Button Style="{StaticResource TestStyle}" Width="100" Height="100" Tag="{Binding Object2}" />
</StackPanel>

Я тестирую многие вещи в своем стиле, но не могу заставить работать привязку.

У кого-нибудь есть идея?

Заранее спасибо за любую помощь С наилучшими пожеланиями.

РЕДАКТИРОВАТЬ:

Изменения в viewmodel:

public class MyObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private Uri _TheUrl;
    public Uri TheUrl
    {
        get { return _TheUrl; }
        set
        {
            _TheUrl = value;
            NotifyPropertyChanged("TheUrl");
        }
    }

    private string _MyText;
    public string MyText
    {
        get { return _MyText; }
        set
        {
            _MyText = value;
            NotifyPropertyChanged("MyText");
        }
    }
}

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private MyObject _Object1;
    public MyObject Object1
    {
        get { return _Object1; }
        set
        {
            _Object1 = value;
            NotifyPropertyChanged("Object1");
        }
    }

    private MyObject _Object2;
    public MyObject Object2
    {
        get { return _Object2; }
        set
        {
            _Object2 = value;
            NotifyPropertyChanged("Object2");
        }
    }

    public ViewModel()
    {
        Object1 = new MyObject {TheUrl = new Uri("test.png", UriKind.Relative), MyText = "Test1"};
        Object2 = new MyObject { TheUrl = new Uri("test.png", UriKind.Relative), MyText = "Test2" };
    }
}

Ответы [ 2 ]

1 голос
/ 23 мая 2011

похоже, что использование DataContext вместо тега на кнопке работает

0 голосов
/ 23 мая 2011

Ваш класс неправильно реализует интерфейс INotifyPropertyChanged.

Добавьте этот метод:

private void NotifyPropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

Чтобы ваши установщики свойств добавили вызов к NotifyPropertyChanged

private Uri _TheUrl;

public Uri TheUrl { 
    get { return _TheUrl;} 
    set { 
        _TheUrl = value; 
        NotifyPropertyChanged("TheUrl");
    } 
}

Вы должны сделать то же самое с Object1 и Object2 (в основном со всеми объектами, с которыми вы хотите связать)

...