2010-11-24 84 views
7

所以我有一個網格需要根據VM中的標誌更改邊距。 似乎datatriggers是正確的處理方法。使用DataTrigger來更改只是左邊距或右邊距(或兩者)

所以我設置了:

<Grid x:Name="myGrid" Grid.Row="1" Margin="30,0"> 
    <Grid.Style> 
     <Style TargetType="Grid"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding UI_Preferences.RightPanelPinned}" Value="true" > 
        <Setter Property="Margin" value="200" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding UI_Preferences.LeftPanelPinned}" Value="true" > 
        <Setter Property="Margin" value="200" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Grid.Style> 
</Grid> 

其中一期工程,但我無法弄清楚如何單獨修改只是左或右頁邊距。

回答

10

保證金實際上是Thickness元素,所以你可以做這樣的:

編輯 - 在機器人被設置添加條件:

<Grid x:Name="myGrid" Grid.Row="1" Margin="30,0"> 
<Grid.Style> 
    <Style TargetType="Grid"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding UI_Preferences.RightPanelPinned}" Value="true" > 
     <Setter Property="Margin"> 
      <Setter.Value> 
      <Thickness Left="200"/> 
      </Setter.Value> 
     </Setter> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding UI_Preferences.LeftPanelPinned}" Value="true" > 
     <Setter Property="Margin"> 
      <Setter.Value> 
      <Thickness Right="200"/> 
      </Setter.Value> 
     </Setter> 
     </DataTrigger> 
     <MultiDataTrigger> 
     <MultiDataTrigger.Conditions> 
      <Condition Binding="{Binding UI_Preferences.LeftPanelPinned}" Value="true" /> 
      <Condition Binding="{Binding UI_Preferences.RightPanelPinned}" Value="true" /> 
     </MultiDataTrigger.Conditions> 
     <Setter Property="Margin"> 
      <Setter.Value> 
      <Thickness Right="200" Left="200"/> 
      </Setter.Value> 
     </Setter> 
     </MultiDataTrigger> 
    </Style.Triggers> 
    </Style> 
</Grid.Style> 

+0

will not t他<厚度右= 200「/>取消<厚度左=」200「/> 萬一他有兩個? – David 2010-11-25 09:22:50

0

好了,這不使用DataTriggers,但它工作得很好,我想它,你在找什麼:

MainWindow.xaml

<Window x:Class="Wpf1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="200" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <Grid x:Name="myGrid" Grid.Row="0" Grid.ColumnSpan="2" Background="AliceBlue"> 
      <Grid.Style> 
       <Style TargetType="Grid"> 
        <Setter Property="Margin" Value="{Binding Margin}" /> 
       </Style> 
      </Grid.Style> 
     </Grid> 
     <Button Content="Left Toggle" Name="LeftButton" Grid.Row="1" Grid.Column="0" /> 
     <Button Content="Right Toggle" Name="RightButton" Grid.Row="1" Grid.Column="1" /> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

using System.Windows; 

namespace Wpf1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      MainWindowVM mainWindowVM = new MainWindowVM(this); 
      this.LeftButton.Click += mainWindowVM.LeftButton_Click; 
      this.RightButton.Click += mainWindowVM.RightButton_Click; 

      DataContext = mainWindowVM; 
     } 
    } 
} 

和視圖模型:MainWindowVM.cs

using System.Windows; 
using System.ComponentModel; 

namespace Wpf1 
{ 
    class MainWindowVM : INotifyPropertyChanged 
    { 
     public MainWindow MainWindow { get; set; } 

     private Thickness _margin; 
     public Thickness Margin 
     { 
      get { return _margin; } 
      set { 
       if (_margin != value) 
       { 
        _margin = value; 
        OnPropertyChanged("Margin"); 
       } 
      } 
     } 

     private bool _rightPanelPinned; 
     public bool RightPanelPinned 
     { 
      get { return _rightPanelPinned; } 
      set 
      { 
       if (_rightPanelPinned != value) 
       { 
        _rightPanelPinned = value; 

        if (_rightPanelPinned == true) 
        { 
         Thickness thickness = Margin; 
         thickness.Right = 30.0; 
         Margin = thickness; 
        } 
        else 
        { 
         Thickness thickness = Margin; 
         thickness.Right = 0.0; 
         Margin = thickness; 
        } 
       } 
      } 
     } 

     private bool _leftPanelPinned; 
     public bool LeftPanelPinned 
     { 
      get { return _leftPanelPinned; } 
      set 
      { 
       if (_leftPanelPinned != value) 
       { 
        _leftPanelPinned = value; 

        if (_leftPanelPinned == true) 
        { 
         Thickness thickness = Margin; 
         thickness.Left = 30.0; 
         Margin = thickness; 
        } 
        else 
        { 
         Thickness thickness = Margin; 
         thickness.Left = 0.0; 
         Margin = thickness; 
        } 
       } 
      } 
     } 

     public MainWindowVM(MainWindow mainWindow) 
     { 
      MainWindow = mainWindow; 

      LeftPanelPinned = false; 
      RightPanelPinned = false; 
     } 

     public void LeftButton_Click(object sender, RoutedEventArgs e) 
     { 
      MainWindow.BeginInit(); 
      LeftPanelPinned = (!LeftPanelPinned); 
      MainWindow.EndInit(); 
      MainWindow.UpdateLayout(); 
     } 

     public void RightButton_Click(object sender, RoutedEventArgs e) 
     { 
      MainWindow.BeginInit(); 
      RightPanelPinned = (!RightPanelPinned); 
      MainWindow.EndInit(); 
      MainWindow.UpdateLayout(); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

我發現最簡單的方法就是將網格的邊距綁定到視圖模型中的屬性。希望這可以幫助!

乾杯,

安德魯