Как динамически обновить PolyLine в WPF?
Моя цель - иметь ломаную линию, в которой я могу добавлять точку каждые 2 секунды, и PolyLine отображает ее в пользовательском интерфейсе.
У меня есть PolyLine, которая связана с ObservableCollection с помощью преобразователя значений следующим образом:
XAML
<Polyline Points="{Binding OutCollection,Mode=TwoWay,Converter={StaticResource pointConverter}}" Stroke="Blue" StrokeThickness="15" Name="Line2" />
Конвертер значений
public class PointCollectionConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
PointCollection outCollection = new PointCollection();
if (value is ObservableCollection<Point>)
{
var inCollection = value as ObservableCollection<Point>;
foreach (var item in inCollection)
{
outCollection.Add(new Point(item.X, item.Y));
}
return outCollection;
}
else
throw new Exception("Wrong Input");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new Exception("Wrong Operation");
}
}
И в коде позади файла:
public MainWindow()
{
InitializeComponent();
this.DataContext = vm;
InitTimer();
}
private void InitTimer()
{
dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(TickHandler);
dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
dispatcherTimer.Start();
}
int counter = 0;
private void TickHandler(object sender, EventArgs e)
{
double val = (counter * counter) * (0.001);
var point = new Point(counter, val);
vm.OutCollection.Add(point);
vm.OutCollection.CollectionChanged += OutCollection_CollectionChanged;
counter++;
}
ViewModel:
public class ViewModel : ViewModelBase
{
public ObservableCollection<Point> OutCollection
{
get
{
return m_OutCollection;
}
set
{
m_OutCollection = value;
this.OnPropertyChanged("OutCollection");
}
}
}
private ObservableCollection<Point> m_OutCollection;
public ViewModel()
{
OutCollection = new ObservableCollection<Point>();
}
Это не работает. Любая помощь приветствуется?!?
1 ответ
Я решил это сам.
ObservableCollection может не помочь, но то, что помогло, это добавить
Line2.GetBindingExpression(Polyline.PointsProperty).UpdateTarget();
в TickHandler()