首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >极限GridSplitter (MVVM)

极限GridSplitter (MVVM)
EN

Stack Overflow用户
提问于 2016-04-27 13:24:18
回答 1查看 288关注 0票数 0

简单地说,当我想限制GridSplitter最大值时,我可以创建不可见的控件(它只参与布局),调整它的Margin并使用它来限制网格列/行定义:

代码语言:javascript
复制
<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,它必须受到父视图的某些布局逻辑的限制。

我该怎么做?我正在寻找一个舒适和可重用的解决方案。

目前,我正以复杂的方式:

  • 向父VM添加属性以绑定limiter值(例如,它的ActualWidth );
  • 添加到嵌套VM属性Parent
  • 将父VM实例传递给嵌套实例(使用属性初始化程序);
  • 现在可以通过使用GridSplitter绑定来限制Parent.SplitterMaxWidth

有什么好的和MVVM友好的方法来解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2016-04-28 13:06:59

对于GridSplitter必须受到父级限制的情况(所有布局都可以转换以确保这一点),可以绑定到该父节点并使用泛型转换器来更改值。如果很难找到父级,那么就创建一个简单的自定义控件:

代码语言:javascript
复制
public class GridLimiter: Grid { }

可以用来标记RelativeSource.FindAncestor很容易到达的容器。

代码语言:javascript
复制
<local:GridLimiter ... >
    ... <!-- deeply nested -->
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:GridLimiter}}}" />
            ...
        </Grid.ColumnDefinitions>
        <GridSplitter ... />
    </Grid>
    ...

此外,制作一个简单的标记扩展转换器:

代码语言:javascript
复制
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();
    }
}

允许在不需要创建不可见限制器的情况下定义偏移:

代码语言:javascript
复制
MaxWidth="{Binding ActualWidth, Converter={local:ValueAddConverter}, ConverterParameter=-30, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:GridLimiter}}}"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36891159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档