简单地说,当我想限制GridSplitter最大值时,我可以创建不可见的控件(它只参与布局),调整它的Margin并使用它来限制网格列/行定义:
<Grid x:Name="limiter" Margin="10,10,20,10" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding StoreWidth, Converter={local:DoubleToGridLengthConverter}, Mode=TwoWay}"
MaxWidth="{Binding ActualWidth, ElementName=gridLimit}" /> <!-- limit maximum -->
...
</Grid.ColumnDefinitions>
<GridSplitter ... />
...
</Grid>现在复杂的情况是:嵌套视图和GridSplitter,它必须受到父视图的某些布局逻辑的限制。
我该怎么做?我正在寻找一个舒适和可重用的解决方案。
目前,我正以复杂的方式:
limiter值(例如,它的ActualWidth );Parent;GridSplitter绑定来限制Parent.SplitterMaxWidth。有什么好的和MVVM友好的方法来解决这个问题吗?
发布于 2016-04-28 13:06:59
对于GridSplitter必须受到父级限制的情况(所有布局都可以转换以确保这一点),可以绑定到该父节点并使用泛型转换器来更改值。如果很难找到父级,那么就创建一个简单的自定义控件:
public class GridLimiter: Grid { }可以用来标记RelativeSource.FindAncestor很容易到达的容器。
<local:GridLimiter ... >
... <!-- deeply nested -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:GridLimiter}}}" />
...
</Grid.ColumnDefinitions>
<GridSplitter ... />
</Grid>
...
此外,制作一个简单的标记扩展转换器:
public class ValueAddConverter : MarkupExtension, IValueConverter
{
public ValueAddConverter() { }
public override object ProvideValue(IServiceProvider serviceProvider) => this;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
(double)value + double.Parse((string)parameter, NumberFormatInfo.InvariantInfo);
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}允许在不需要创建不可见限制器的情况下定义偏移:
MaxWidth="{Binding ActualWidth, Converter={local:ValueAddConverter}, ConverterParameter=-30, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:GridLimiter}}}"https://stackoverflow.com/questions/36891159
复制相似问题