Поля привязки сетки (или элемента управления) в WPF

Я хочу привязать маржу некоторых элементов управления, скажем, кнопку, например:

<Window.Resources>
    <local:MarginConverter x_Key="marginConverter1"/>
</Window.Resources>

<Grid HorizontalAlignment="Left" VerticalAlignment="Top" 
      Margin="{Binding MyThickness, 
      Converter={StaticResource marginConverter1}}">
    <Button>Button1</Button>
</Grid>

Согласно ref. здесь: SO: Binding a part of the margin, I created a MarginConverterclass and a MyDataContextclass to implement INotifyPropertyChangedinterface (см. ниже), but the Button1persists in the top-left position (as if its margin is 0).

Public Class MyDataContext
   Implements INotifyPropertyChanged

   Private _myThickness As Thickness = New Thickness(20, 10, 20, 0)

   Public Event PropertyChanged As PropertyChangedEventHandler _
       Implements INotifyPropertyChanged.PropertyChanged

   Private Sub OnPropertyChanged(propertyName As String)
       RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
   End Sub

   Public Property MyThickness As Thickness
       Get
           Return _myThickness 
       End Get
       Set(value As Thickness)
           _myThickness = value
           OnPropertyChanged("MyThickness")
       End Set
   End Property
End Class

И код позади:

Dim myDataContext1 As New MyDataContext()
Private Sub Window1_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
   myDataContext1.MyThickness = New Thickness(20, 150, 20, 0)
End Sub

Пожалуйста, помогите мне прояснить мое непонимание, даже базовые знания или четкое объяснение от вас будут оценены!

P / S: мое намерение для привязки верхнего поля заключается в том, что когда пользователь выполняет какую-то конкретную задачу, в верхней части окна появится граница высотой 25, поэтому все существующие элементы управления должны идти вниз.
Так что если у вас есть другой подход, пожалуйста, поделитесь здесь. Спасибо!.

2 ответа

  1. Если вы только хотите обеспечить высоту 25 в верхней части сетки динамически,
    Это можно сделать, добавив границу в верхнюю строку сетки и изменив ее видимость на «свернутую» на «видимую».

    <Grid HorizontalAlignment="Left" VerticalAlignment="Top">
        <StackPanel>
        <Border Height="25"   Visibility="Collapsed">
    
        </Border>
        <Button >Button1</Button>
        </StackPanel>
    </Grid>
    
  2. Хорошо так вот рабочий пример для вас, извините, но только на C#
    приложение.код XAML

      <Application.Resources>
        <ResourceDictionary>
                <viewModel:TestVM x_Key="TestVm"/>
        </ResourceDictionary>
      </Application.Resources>
    

    модель представления

    public class TestVM : INotifyPropertyChanged
        {
            Thickness myThickness = new Thickness(20,10,20,0);
    
            public Thickness MyThickness
            {
                get { return myThickness; }
                set { myThickness = value; OnPropertyChanged(); }
            }
    
    
    
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    

    Window1.код XAML

    <Window x_Class="WPF_Test_Canvas_Chart.Windows.Window1"
            
            
            
            
            
            mc_Ignorable="d"
            DataContext="{StaticResource TestVm}"
            Title="Window1" Height="300" Width="300">
        <Grid HorizontalAlignment="Left" VerticalAlignment="Top" 
          Margin="{Binding MyThickness}">
                <Button>Button1</Button>
            </Grid>
    
    </Window>
    

    Window1.цезий

    public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
                var data = this.DataContext as TestVM;
                data.MyThickness = new Thickness(100,10,20,0);
            }
        }