Значения DataContext в коде представления позади
В шаблоне MVVM допустимо или даже возможно получить доступ к свойствам ViewModel в коде представлений позади?
У меня есть наблюдаемая коллекция, которая заполнена в ViewModel. Мне нужно использовать его в представлении, чтобы привязать бесконечный тикер со связанным списком. т.е.
private LinkedList<Border> tickerForex = new LinkedList<Border>();
public ForexBuy()
{
InitializeComponent();
DataContext = new ForexViewModel();
}
private void InitializeForexTicker()
{
CanvasForexBuyTicker.Children.Clear();
foreach (var currency in DataContext.Currencies) //Is this possible/allowable???
{
AddTickerItem(currency);
}
CanvasForexBuyTicker.Dispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate
{ var node = tickerForex.First;
while (node != null)
{
if (node.Previous != null)
{
Canvas.SetLeft(node.Value, Canvas.GetLeft(node.Previous.Value) + node.Previous.Value.ActualWidth + gap);
}
else
{
Canvas.SetLeft(node.Value, CanvasForexBuyTicker.Width + gap);
}
node = node.Next;
}
return null;
}), null);
}
void AddTickerItem(Currency currency)
{
Border border = new Border();
border.Background = new SolidColorBrush(Color.FromArgb(255, 0, 99, 99));
if (currency.IsUpward == 0)
{
border.Background = new SolidColorBrush(Color.FromArgb(255, 255, 153, 0));
}
border.BorderThickness = new Thickness(3);
border.BorderBrush = new SolidColorBrush(Colors.White);
border.CornerRadius = new CornerRadius(10);
border.Width = Double.NaN;
border.Height = 35;
UIHelper.CanvasAutoSize canvas = new UIHelper.CanvasAutoSize();
canvas.Background = Brushes.Green;
canvas.Tag = currency;
canvas.Height = Double.NaN;
TextBlock tb = new TextBlock
{
Text = currency.Code + " " + currency.Sell + " ",
FontSize = 22,
FontWeight = FontWeights.Bold,
Foreground = Brushes.Black
};
tb.SetValue(Canvas.LeftProperty, 8d);
tb.SetValue(Canvas.TopProperty, 2d);
canvas.Children.Add(tb);
tb.TouchDown += TouchTickerItem;
border.Child = canvas;
CanvasForexBuyTicker.Children.Add(border);
Canvas.SetTop(CanvasForexBuyTicker, 3);
Canvas.SetLeft(CanvasForexBuyTicker, 0);
tickerForex.AddLast(border);
}
Я немного растерялся относительно того, должен ли диспетчер запускать из ViewModel или использовать его в коде представлений позади.
2 ответа
Если вопрос только в том, как получить доступ к ViewModel из кода позади, вы можете просто привести DataContext к нужному типу:
var viewModel = (MyViewModel)DataContext;
foreach (var currency in viewModel.Currencies)
{
...
}
Если это приемлемо или нет, это вопрос вкуса. Я не вижу принципиальной разницы в доступе к модели представления по привязкам в XAML представления или по фрагменту кода.
Краткий ответ: НЕТ.
Вы не должны размещать специфический для бизнеса или модели код в коде позади. В коде следует размещать только специфичный для VIEW код.
Почему ты объявляешь List<Border>
, Звучит странно для меня. Что именно ты пытаешься сделать?