使用WPF DataBinding,如何为单个源提供多个客户端?

时间:2010-02-21 19:51:50

标签: binding

我有一个实现INotifyPropertyChanged的数据类和两个相同值的DataBind的WPF控件。只更新了一个WPF控件,为什么?

这是我的数据类:

using System;
using System.ComponentModel;
using System.Windows.Threading;

namespace TestMultiBind
{
    class DataSource : INotifyPropertyChanged
    {
        static int _DataValue;
        static DispatcherTimer tmr = new DispatcherTimer();
        static int _ClientCount = 0;

        #region InotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion

        public int DataValue
        {
            get { return _DataValue; }
        }

        public DataSource()
        {
            if (!DesignerProperties.GetIsInDesignMode(new System.Windows.DependencyObject()))
            {
                _ClientCount = _ClientCount + 1;
                if (!tmr.IsEnabled)
                {
                    tmr.Interval = TimeSpan.FromMilliseconds(10);
                    tmr.Tick += new EventHandler(tmr_Tick);
                    tmr.Start();
                }
            }
        }
        void tmr_Tick(object sender, EventArgs e)
        {
            _DataValue = DateTime.Now.Second;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("DataValue"));
            }
        }
    }

}

,这是我的XAML

Title="Window1" Height="300" Width="300">
<Grid>
    <StackPanel>
        <ProgressBar Height="20"  Name="progressBar1" Value="{Binding Mode=OneWay, Path=DataValue}" Maximum="60">
            <ProgressBar.DataContext>
                <ds:DataSource/>
            </ProgressBar.DataContext>
        </ProgressBar>
        <ProgressBar Height="30"  Name="progressBar2" Value="{Binding Mode=OneWay, Path=DataValue}" Maximum="60">
            <ProgressBar.DataContext>
                <ds:DataSource/>
            </ProgressBar.DataContext>
        </ProgressBar>
    </StackPanel>
</Grid>

我试图提供最简单的示例,因此我创建了一个数据类,它使用计时器每秒更新一次值。我试图解决的现实世界问题是来自要显示的串行端口的数据。因此,我需要为类中的传入数据存储静态数据,以及处理与控件绑定的数据的每个客户端(WPF控件)的实例特定事件。

我的tmr_Tick例程似乎是某个特定于第一个客户端的实例,而不是静态到类并提升每个客户端所需的多个事件。

我在这里错过了什么或做错了什么?

1 个答案:

答案 0 :(得分:0)

我不确定这是否是最好的方法,但它确实有效。我的初始代码的问题是我需要一个静态类的实例构造函数。计时器是在静态构造函数中创建的(只运行一次),而每个绑定需要一个事件处理程序,因此这将在实例构造函数中处理。

以下是有效的代码:

using System;
using System.ComponentModel;
using System.Windows.Threading;

namespace TestMultiBind
{
    class DataSource : INotifyPropertyChanged
    {
        static int _DataValue;
        static DispatcherTimer tmr = new DispatcherTimer();

        #region InotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion

        public int DataValue
        {
            get { return _DataValue; }
        }

        static DataSource()
        {
            if (!DesignerProperties.GetIsInDesignMode(new System.Windows.DependencyObject()))
            {
                tmr.Interval = TimeSpan.FromMilliseconds(10);
                tmr.Start();
            }
        }
        public DataSource()
        {
            if (!DesignerProperties.GetIsInDesignMode(new System.Windows.DependencyObject()))
            {
                tmr.Tick += new EventHandler(tmr_Tick);
            }
        }
        void tmr_Tick(object sender, EventArgs e)
        {
            _DataValue = DateTime.Now.Second;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("DataValue"));
            }
        }
    }
}