xaml ピボット ページからユーザー コントロールのテキスト ブロックにタイマー ティック カウントをバインドする方法。以前はクラスからバインディング値を取得していましたが、変更されたプロパティが機能せず、null 値を返します。
public class sample
{
int timercount = 0;
public int Timercount
{
get
{
return timercount;
}
set
{
timercount = value;
base.OnPropertyChanged("Timercount");
}
}
}
public class ViewModelBaseEx : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
xaml:
<TextBlock Height="34" Name="txtTimer" Width="57" TextAlignment="Left" FontSize="20" TextWrapping="Wrap" Text="{Binding Timercount,Mode=TwoWay}" VerticalAlignment="Top" />
これは、xaml ページで設定したバインディングです
TimerPageModel mainPage = new TimerPageModel();
Binding binding = new Binding("Timercount");
binding.Source = mainPage;
binding.Mode = BindingMode.TwoWay;
TextBlock tblk = qplayer.txtTimer;
BindingOperations.SetBinding(tblk, TextBlock.TextProperty, binding);
qplayerはユーザーコントロールで、TimerPageModelはViewModelBaseExを継承するビューモデルですPropertyChangedは機能していますが、ユーザーコントロールのテキストブロックには何もバインドされていません
バインディングはタイマーティックで機能します
public class TimerPageModel : ViewModelBaseEx
{
private DispatcherTimer timer = new DispatcherTimer();
private Random random = new Random();
static int tmrRnd = 30;
public TimerPageModel()
{
timer.Interval = new TimeSpan(0, 0, 5);
timer.Tick += OnTimer;
timer.Start();
}
}
int timercount = 0;
public int Timercount
{
get
{
return timercount;
}
set
{
timercount = value;
base.OnPropertyChanged("Timercount");
}
}
void OnTimer(object sender, EventArgs eventArguments)
{
//CurrentValue = random.Next(100);
Timercount = tmrRnd--;
}