У меня есть конвертер, который я использую для определения размера дочернего элемента на основе размера его контейнера (родительского).
<Setter Property="Width" Value="{Binding ActualWidth, ElementName=rowsContainer,
Converter={StaticResource sizer}}"/>
public class CellSizeConverter : IValueConverter
{
private readonly int _maxNum = 7;
private readonly int _margin = 0;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return null;
}
double width = (double)value;
return (width / _maxNum) - _margin;
}
}
Это работает, и когда я изменяю размер своего окна, размер компонентов меняется. Ура!
Я также хочу учитывать высоту, поэтому я попытался передать сам элемент управления и получить его свойства внутри конвертера:
<Setter Property="Width" Value="{Binding ElementName=rowsContainer, Converter={StaticResource sizer}}"/>
public class CellSizeConverter : IValueConverter
{
private readonly int _maxNum = 7;
private readonly int _margin = 0;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return null;
}
ItemsControl rowsContainer = (ItemsControl)value;
return (rowsContainer.ActualWidth / _maxNum) - _margin;
}
}
Однако, когда я это делаю, размер никогда не меняется. Кажется, что управление передается конвертеру один раз, но никогда не обновляется. Я предполагаю, что это как-то связано с передачей по ссылке, а не по значению. Или что-то в этом роде.
Я знаю, что могу передать несколько значений в конвертер, используя MultiBinding
и IMultiValue Converter
, но поскольку все значения, которые мне нужны, уже заключены в красивый маленький объект ( элемент управления) было бы намного чище в моем xaml, если бы просто привязать его таким образом.
Как передать элемент управления, чтобы он обновлялся?