#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;
}}