Привязка к элементу в ObservableCollection

#wpf

#wpf

Вопрос:

Как вы делаете привязку к элементу коллекции в этом случае?

 //Both collections have OnPropertyChanged("");
public ObservableCollection<Grid> ConnectorsGrids { get; set; }
public ObservableCollection<double> Connectors { get; set; }

//Coordinates collection
Connectors = new ObservableCollection<double>() { 10 , A - 20 };

ConnectorsGrids = new ObservableCollection<Grid>();

foreach (var e in Connectors)
{
    ConnectorsGrids.Add(DrawConnector(new Thickness(e * YB1, 0, 0, 0)));
}
  

YB1 — коэффициент для размера элемента. Это переменная в зависимости от размера экрана

YB1 отсутствует ни в одной коллекции. Является параметром в классе

DrawConnector() принимает поле в качестве параметра

Я бы хотел, чтобы поле менялось в зависимости от размера экрана

На данный момент он вычисляет выходное значение, а затем при изменении размера экрана изменения сохраняются

Комментарии:

1. Вам нужно прослушать событие SystemEvents.DisplaySettingsChanged , чтобы узнать, когда изменяется размер экрана, а затем повторно вычислить YB1 и, возможно, повторно создать ConnectorGrid элементы.

2. почему у вас есть наблюдаемая коллекция <Grid>, которая немного необычна, не могли бы вы уточнить, чего вы пытаетесь достичь в большем масштабе? где вы привязываете свою ObservableCollection

Ответ №1:

Вы можете попробовать это:

xaml:

 <ItemsControl x:Name="PART_ItemsControl"
          ItemsSource="{Binding Connectors}">
   <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding Converter={local:ToGridConverter}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
  

Конвертер:

 sealed class ToGridConverter : MarkupExtension, IValueConverter{
   public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value is double)
    {
       double e = (double)value;
       return DrawConnector(new Thickness(e * YB1, 0, 0, 0));
    }            
    return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    throw new NotImplementedException();
}

private ToGridConverter _converter;
public override object ProvideValue(IServiceProvider serviceProvider)
{
    if (_converter == null)
    {
        _converter = new ToGridConverter ();
    }
    return _converter;
}}