Silverlight样式和绑定

问题描述

| 我在Silverlight样式中遇到绑定问题。 这是我的viewmodel:
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\",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\",MyText = \"Test1\"};
        Object2 = new MyObject { TheUrl = new Uri(\"test.png\",MyText = \"Test2\" };
    }
}
    

解决方法

似乎在按钮上使用DataContext而不是Tag是有效的     ,您的课程未正确实现
INotifyPropertyChanged
接口。 添加此方法:
private void NotifyPropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this,new PropertyChangedEventArgs(propertyName));
            }
        }
向您的财产设定者添加呼叫to5ѭ
private Uri _TheUrl;

public Uri TheUrl { 
    get { return _TheUrl;} 
    set { 
        _TheUrl = value; 
        NotifyPropertyChanged(\"TheUrl\");
    } 
}
您应该对
Object1
Object2
进行相同设置(基本上是要绑定到的所有对象)