WPF MVVM绑定控件的Margin属性

时间:2017-06-12 07:17:22

标签: c# wpf mvvm caliburn.micro

使用caliburn.micro在MVVM模式中构建wpf应用程序。 我需要动态设置按钮的margin属性。 有一个question,我有一些想法,但不适用于MVVM。

我试过这个。

XAML

<Grid>
<Button Content="Test" Margin="{Binding ButtonMargin}"/>
<Grid/>

视图模型

private Thickness _buttonMargin
public Thickness ButtonMargin
{
   get { return _buttonMargin; }
   set
   {
       if (_buttonMargin != value)
       {
           _buttonMargin = value;
           NotifyOfPropertyChange(() => ButtonMargin);
       }
   }
}


//constructor
ButtonMargin = new Thickness(20,10,20,10);

我看不到应用于Button的保证金。它的默认边距为0.

这是正确的方法吗?我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

以下是在Button内工作的Margin Grid的示例。
这是一个pure XAML解决方案:

<UserControl x:Class="SO_app.ForRahul"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:SO_app"
         xmlns:vm="clr-namespace:VM;assembly=VM"//reference to our View Model assembly
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<UserControl.DataContext>
    <vm:MainViewModel/>//setting up the data context of our UserControl
</UserControl.DataContext>
<UserControl.Resources>
    <Style TargetType="ToggleButton">//this is the money maker, this style relies on the property of a button but can be easily adapted to Binding with a View Model
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" Value="true">
                <Setter Property="Margin" Value="10"/>//sets the margin of a control, you can also put in here "10,10" or "10,10,20,20"
            </DataTrigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
<Grid>
    <ToggleButton Content="Test" />//Button that we modify the Margin
</Grid>


这是一个如何在主窗口中使用它的示例:

<Window x:Class="SO_app.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:VM;assembly=VM"
    xmlns:local="clr-namespace:SO_app"//this is where our Control resides
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <vm:MainViewModel/>
</Window.DataContext>
<Grid>
    <Control>
        <Control.Template>
            <ControlTemplate>
                <local:ForRahul/>
            </ControlTemplate>
        </Control.Template>
    </Control>
</Grid>


如果您需要更多信息,请告知我们。
如果您使用Style,那么您可以在应用程序中重复使用它,如果您在代码中执行它,那么您将必须使其成为static或者您必须在项目中引用程序集。
假设
我假设您的保证金只需要一个新值 的更新
根据您的要求,您需要将值保留在XAML中我建议的App.xaml,因为这是您默认加载的所有窗口,在那里您应该像这样引用它:

<Thickness x:Key="btnMargin" Left="10" Right="10" Top="10" Bottom="10"/>  

然后,当您需要根据某些逻辑更改它时,您可以在后面的代码中使用它:

var newMargin = App.Current.Resources["btnMargin"] as Thickness;//get the thickness
var button = grid.Children.OfType<Button>().FirstOrDefault(b => b.Content == "Some Text");//find the correct button
button.Margin = newMargin;