使用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.
这是正确的方法吗?我怎样才能做到这一点?
答案 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;