2017-06-12 1 views
-2

Erstellen einer WPF-Anwendung im MVVM-Muster mithilfe von caliburn.micro. Ich muss die Randeigenschaft der Schaltfläche dynamisch festlegen. Es gibt eine question und ich hatte eine Idee, aber das ist nicht für MVVM.WPF MVVM bind Margin-Eigenschaft eines Steuerelements

Ich habe das versucht.

XAML

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

Ansichtsmodell

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); 

Ich kann nicht-Marge auf Knopf angewendet sehen. Der Standardwert ist 0.

Ist dies der richtige Weg? Wie kann ich das machen?

+0

Was bedeutet „kein Erfolg“ bedeuten? Beobachten Sie Fehler im Ausgabefenster? – dymanoid

+0

Spezifischer sein. Stellen Sie eine gute [mcve] bereit, die das Problem zuverlässig reproduziert. _Beschreibe das Problem. Erklären Sie _precely_ly, was der Code tut, was Sie stattdessen tun wollen, und was _specificific__ Sie versucht haben, es zu beheben, und was_spezial_ Sie haben immer noch Schwierigkeiten herauszufinden. –

+0

Ändern Sie den Bindungsmodus in XAML als TwoWay –

Antwort

0

Hier ist ein Beispiel für eine Button 's Margin arbeitet innerhalb einer Grid.
Hier ist eine pure XAML Lösung:

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


Und hier ist ein Beispiel dafür, wie man es in einem Hauptfenster verwenden: wissen

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


Wenn Sie weitere Informationen lassen Sie uns brauchen .
Wenn Sie ein Style verwenden, können Sie es in Ihrer Anwendung wiederverwenden, wenn Sie es in Code tun, dann müssen Sie es entweder static machen, oder Sie müssen eine Assembly in Ihren Projekten referenzieren.
Annahmen
Ich gehe davon aus, dass Sie nur einen neuen Wert für Ihre Margin benötigen.
UPDATE
Für Ihre Anforderung müssen Sie in der XAML den Wert irgendwo halten, würde ich die App.xaml wie dies vorschlagen, ist das, was alle Fenster standardmäßig geladen werden, da Sie einen Verweis auf sie wie so haben sollte:

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

Dann, wenn Sie es ändern müssen, basierend auf einem gewissen Logik, die Sie im Code hinter verwenden:

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; 
+0

Wie kann ich den Rand während der Laufzeit ändern? – Rahul

+0

Meinst du den Wert der Margin? Also zur Laufzeit wollen Sie es ändern, sagen wir von (10,10,10,10) zu (20,10,20,10)? – XAMlMAX

+0

Ja, ich muss ändern, zumindest erstmal muss ich es basierend auf einer Logik setzen. Meine Idee ist der Wert innerhalb des ViewModel-Konstruktors. – Rahul