WPF,属性不向绑定返回值



所以,我有一个项目,其中包含在字符串数组上旋转的滚动文本(marqee)。我希望它在每次动画迭代 20 秒后更改字符串值。

但是有一个问题,使用 INotifyPropertyChanged 接口绑定到文本块(使用 XAML)的属性(滚动文本)在第一次迭代后不会返回。即使它正常刷新(在设置部分),它也不会在 Getter 部分返回......默认 CTOR 中的第一组除外。

主要类:

class GetScrollingText : CommonBase
{
    private string _scrollingtext = String.Empty;
    DoubleAnimation Animation;
    public GetScrollingText()
    {
        ScrollingText = GetScrollString();
    }
    public string ScrollingText
    {
        get
        {
            return _scrollingtext;
        }
        set
        {
            if (value != _scrollingtext)
            {
                _scrollingtext = value;
                RaisePropertyChanged("ScrollingText");
            }               
        }
    } // INJECTS the string in the animated textblock {binding}.
    public TextBlock scrollBlock { get; set; }
    string GetScrollString()
    {
        .........
        return scrolltext;
    }      
    public void LeftToRightMarqee(double from, double to)
    {
        Animation = new DoubleAnimation();
        Animation.From = from;
        Animation.To = to;
        Animation.Duration = new Duration(TimeSpan.FromSeconds(20));
        Animation.Completed += animation_Completed;
        scrollBlock.BeginAnimation(Canvas.LeftProperty, Animation);
    }
    void animation_Completed(object sender, EventArgs e)
    {
        ScrollingText = GetScrollString();           
        scrollBlock.BeginAnimation(Canvas.LeftProperty, Animation);
    }
}

出于某种原因,animation_Completed事件仅更改值 ScrollingText,但它不会调用 Getter 部分,因此不会返回 {binding}。

XAML:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:AnnouncingSys"
    x:Class="AnnouncingSys.MainWindow"
    x:Name="Window"
    Width="1280" Height="720" MinHeight="566" MinWidth="710">
    <Window.Resources>
        <vm:GetScrollingText x:Key="ScrollingText"/>
    </Window.Resources>
    <Canvas x:Name="MainCanvas" ClipToBounds="True" Margin="0,0,0,0" Grid.Row="5" Background="Black" Grid.ColumnSpan="5" >
        <TextBlock x:Name="ScrollBlock" TextWrapping="Wrap" VerticalAlignment="Top" Height="113" Width="5147" Canvas.Left="-1922" Text="{Binding ScrollingText, Source={StaticResource ScrollingText}}"/>
    </Canvas>
</Window>

代码隐藏:

public partial class MainWindow : Window
{
    GetScrollingText scrolling = new GetScrollingText();
    public MainWindow()
    {
        InitializeComponent();
        scrolling.scrollBlock = this.ScrollBlock;
        scrolling.LeftToRightMarqee(2000, -3000);
    }
}

最后是帮助程序类 CommonBase:

public class CommonBase : INotifyPropertyChanged
{
    protected CommonBase()
    {
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged(string PropertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            PropertyChangedEventArgs e = new PropertyChangedEventArgs(PropertyName);
            handler(this, e);
        }
    }
}

我什至在 Getter 的返回块上放置了一个断点,但它只在第一个断点上激活:"ScrollingText = GetScrollString()"。我的意思是,它不应该在每次更改值时返回吗???

你正在使用 GetScrollingText 类的两个不同实例,一个在 XAML 中作为静态资源,另一个在代码隐藏中作为类 MainWindow 中的scrolling字段。

无需在 XAML 中创建 StaticResource ,只需设置 MainWindow 的 DataContext 属性:

public partial class MainWindow : Window
{
    GetScrollingText scrolling = new GetScrollingText();
    public MainWindow()
    {
        InitializeComponent();
        scrolling.scrollBlock = this.ScrollBlock;
        scrolling.LeftToRightMarqee(2000, -3000);
        DataContext = scrolling; // here
    }
}

现在,您不会显式设置绑定的 Source 属性,因为 DataContext 用作默认绑定源:

<TextBlock ... Text="{Binding ScrollingText}"/>

相关内容

  • 没有找到相关文章

最新更新