2016-04-27 29 views
0

簡單的情況下,我想限制GridSplitter最大的,那麼我就可以創建無形控制(只參與布點),調整其Margin和使用,限制格列/行定義:限制GridSplitter(MVVM)

<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;
  • 將父虛擬機實例傳遞給嵌套的一個(使用屬性初始值設定項);
  • 現在GridSplitter可以通過使用Parent.SplitterMaxWidth綁定來限制。

有沒有什麼好的和MVVM友好的方法來解決這個問題?

+0

我寧願考慮使用行爲,而不是虛擬的。在我看來ViewModels不應該有像ActualWidth這樣的東西。它們應該包含模型邏輯,而不是演示邏輯。 – mikes

+0

@ mikes,我同意。我究竟能用行爲來做到這一點?您會看到問題:在一個視圖中測量寬度/高度,並且必須在其他視圖中使用該值。這確實是某種觀看通信(如果沒有虛擬機之間的話)。有時可以用'FindAncestor'綁定,但在我的情況下'GridSplitter'從來沒有那麼容易(限制器不是它的父代)。 – Sinatr

+0

視圖如何彼此分離?他們在一個共同的觀點?例如,左視圖控制右視圖參數? – mikes

回答

0

對於GridSplitter必須受父母限制的情況(TBH,我可以轉換所有佈局以確保這一點),可以綁定到該父級並使用通用轉換器來更改值。如果父母是難以達到的,然後做一個簡單的自定義控制:

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}}}"