wpf изменить ширину столбца после нажатия на кнопку (шаблон MVVM) - PullRequest
0 голосов
/ 22 февраля 2019

я пытаюсь изменить ширину столбца после нажатия на кнопку.

Я изучаю шаблон MVVM и хочу избежать кода позади.

Я могу инициализировать ширину в0 но мне не удается изменить ширину во время выполнения.

я покажу вам копию моего кода.

Надеюсь, вы можете помочь мне!

спасибо большое, парень

ура Кирилл

MainView.xaml

<Grid.ColumnDefinitions>
     <ColumnDefinition Width="10"/>
     <ColumnDefinition Width="{Binding NotamWidth}"/>
     <ColumnDefinition Width="*"/>
     <ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>

MainViewModel для привязки ширины и инициализации ширины столбца в 0

//Propoerty for column width
public GridLength NotamWidth { get; set; }
public AirportViewModel()
{
   //initialize width of column at 0
   MainGridModel MainGridModel = new MainGridModel(new GridLength(0));
   this.NotamWidth = MainGridModel.NotamWidth;
 }

MainGridModel, которыйсвойство поддержки для сетки

private GridLength notamWidth;

    public MainGridModel(GridLength width)
    {
        NotamWidth = width;
    }

    public GridLength NotamWidth
    {
        get
        {
            return notamWidth;
        }
        set {

            notamWidth = value;
        }
    }

RelayCommand для изменения ширины столбца

public void ShowNotamExecute(object parameter)
{
 //Masque la colonne notam            
 this.NotamWidth = new GridLength(400);
 }

Ответы [ 5 ]

0 голосов
/ 03 марта 2019

Здравствуйте и спасибо за ваш ответ.

Я пробую все ваши предложения.Но я все еще был в состоянии изменить ширину столбца с шаблоном MVVM.Я наконец решил пойти с кодом позади.Позже я попробую еще раз, чтобы избежать этого решения

Определение сетки

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="10"/>
  <ColumnDefinition Width="600" />
  <ColumnDefinition Width="0"/> <-- Column hide at initiliasition--!>
  <ColumnDefinition Width="*"/>
  <ColumnDefinition Width="10"/>
< /Grid.ColumnDefinitions>

кнопка с событием щелчка

<Button Name="AirportButton
  Click="AirportButton_Click"
  Height="30"
</Button>

Щелкните событие, чтобы отобразить столбец.

   private void AirportButton_Click(object sender, RoutedEventArgs e)
    {
        //Set the column width at 500 after a click on the button);
        MainWindow.ff.ColumnDefinitions[2].Width = new GridLength(500);


    }

Я буду обновлять свой код, когда найду решение

Cyrille

0 голосов
/ 23 февраля 2019

Вместо привязки ширины столбца Grid.Column можно установить для него значение «Авто», а затем привязать свойство «Ширина» корневой панели для этого столбца.После этого вы можете создать свой пользовательский интерфейс внутри корневой панели.

Вот структура, которую я предлагаю:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="10"/>
    </Grid.ColumnDefinitions>
    ...
    <Grid Grid.Column="1" x:Name="myRootPanelForColumn1" Width="{Binding NotamWidth}">

    </Grid>
    ...
</Grid>

INotifyPropertyChanged в вашей ViewModel остается обязательным, а также установка DataContext вашего окна / приложения в качестве экземпляра вашей ViewModel.

PS: обратите внимание, что свойство Grid.Width имеет другой тип.Вам необходимо обновить тип свойства NotamWidh в ViewModel

0 голосов
/ 23 февраля 2019

Я стараюсь следовать вашему совету.Я обновляю свой код для вставки InotifyPropertyChanged, а также изменяю свойство привязки.Я больше не могу инициализировать ширину столбца, и команда кнопки по-прежнему не меняет ширину определения столбца.это сводит меня с ума ...

MainView.xaml с Resource и обновленным свойством Binding

xmlns:mw="clr-namespace:WpfAppEssaisMVVM.Model.Windows"

<Window.Resources>
    <!--Instance of mainGridModel -->
    <mw:MainGridModel x:Key="MainGridModel"/>
</Window.Resources>

<Grid.ColumnDefinitions>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="500" />
        <ColumnDefinition Width="{Binding Source={StaticResource MainGridModel},Path=NotamWidth, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="10"/>
    </Grid.ColumnDefinitions> 

MainGridModel, реализующий InotifyPropertyChanged и Binding ColumnDefinition

    private GridLength notamWidth;

    public GridLength NotamWidth
    {
        get
        {
            return notamWidth;
        }
        set
        {
            notamWidth = value;
            OnPropertyChanged("NotamWidth");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string PropertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
    }

MainViewModel, управляющий NotamWidthСвойство и relayCommand для кнопки команды

public MainViewModel()
    {
        //Initialize the column to gridlength 0
        MainGridModel MainGridModel = new MainGridModel
        {
            NotamWidth = new GridLength(0)
        };
     }
//Action on button command
public void ShowNotamExecute(object parameter)
    {
       //set the column Width
        MainGridModel MainGridModel = new MainGridModel
        {
            NotamWidth = new GridLength(400)
        };

    }
0 голосов
/ 23 февраля 2019

Как и большинство людей, вам нужно иметь INotifyPropertChanged там, где ваша переменная связана с.

xaml:

<Grid.ColumnDefinitions>
 <ColumnDefinition Width="10"/>
 <ColumnDefinition Width="{Binding NotamWidth, UpdateSourceTrigger=PropertyChanged}"/>
 <ColumnDefinition Width="*"/>
 <ColumnDefinition Width="10"/>

Затем вам необходимо иметь правильный "Datacontext", определенный в вашем конструкторе для xaml.cs.Например, если «NotamWidth» является переменной в вашем xaml.cs, вы должны установить Datacontext равным «this».

xaml.cs:

Datacontext = this; 

Однако, скажем, NotamWidth является переменной в другом классе «GridChanger».Один из способов получить правильный Datacontext - создать глобальный экземпляр класса «GridChanger» в вашем xaml.cs, а затем сделать Datacontext равным экземпляру.

xaml.cs:

public class MainWindow 
{
    GridChanger gChng = new GridChanger();

    public MainWindow()
    {
        DataContext = gChng;
    }
}

Оттуда мы можем создать переменную, с которой будем связываться.Возможно, есть лучший способ сделать это, но я всегда делал переменные, которые связываю таким образом.

whereveryourvariableis.cs

private double _NotamWidth;

public double NotamWidth
{
    get
    {
        return _NotamWidth;
    }
    set
    {
        _NotamWidth = value;
        if (PropertyChanged != null)
        {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(NotamWidth)));
        }
    }
}
0 голосов
/ 22 февраля 2019

Как упоминает Даниэль в приведенном выше комментарии, вам нужно реализовать INotifyPropertyChanged.Ответ Марка Гравелла на этот вопрос ( Реализация INotifyPropertyChanged - существует ли лучший способ? ) содержит всю информацию, которая вам необходима для этого.

Кроме того, вам необходимо изменить привязкувключить Mode и UpdateSourceTrigger (см. ниже):

<Grid.ColumnDefinitions>
     <ColumnDefinition Width="10"/>
     <ColumnDefinition Width="{Binding NotamWidth, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
     <ColumnDefinition Width="*"/>
     <ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...