Обновить свойство в ViewModel, когда элемент управления получает фокус - PullRequest
2 голосов
/ 12 января 2011

Я ищу правильный синтаксис в моем XAML для установки свойства в моей Viewmodel (например, «BusyEditing»), которое затем уже было связано с привязкой «IsEnabled» кнопки.По сути, я хочу, чтобы кнопка «Сохранить» была включена, как только я введу поле, чтобы начать его редактирование.Что было бы еще круче, если бы свойство обновлялось при ИЗМЕНЕНИИ значения текстового поля, а не только у GotFocus.

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 12 января 2011

Вы можете легко сделать это, используя Commanding . Если вы связываете команду на вашей ViewModel с вашей кнопкой, и метод CanExecute ищет действительную информацию из ваших других входов, то она останется отключенной, пока не будет выполнено это условие.

В MVVM Light это будет выглядеть примерно так

public RelayCommand LogonCommand { get; private set; }

LogonCommand = new RelayCommand(
                    Logon,
                    CanLogon
                );

private Boolean CanLogon(){
    return !String.IsNullOrWhiteSpance(SomeProperty);
}

В вашем XAML просто обязательно свяжите команду кнопки с командой ViewModel:

<Button Command="{Binding LogonCommand}" />

Если ваше текстовое поле привязано к SomeProperty, это будет работать без какой-либо дополнительной работы и без кода, необходимого.

Кроме того, если вы хотите использовать этот триггер при изменении свойства вместо LostFocus, вам нужно определить это явно.

<TextBox>
  <TextBox.Text>
    <Binding Source="{StaticResource myDataSource}" Path="SomeProperty"
             UpdateSourceTrigger="PropertyChanged"/>
  </TextBox.Text>
</TextBox>
0 голосов
/ 12 января 2011

Ленивое, быстрое и не очень элегантное решение, если у вас есть только одно текстовое поле:

    <TextBox Name="TB" Width="200"/>
    <Button Content="Save">
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=TB, Path=Text}" Value="">
                        <Setter Property="IsEnabled" Value="False"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

Кнопка будет активирована, как только текст появится в текстовом поле.

0 голосов
/ 12 января 2011

Вам нужно будет использовать EventTrigger.На самом деле, два из них.Один для GotFocus и другой для LostFocus события.

Вот пример:

Использование EventTrigger в XAML для MVVM - без кода за кодом

Ищите SetProperty действие триггера.Это будет полезно для вас.

0 голосов
/ 12 января 2011

Звучит так, будто вы хотите назвать свое свойство IsDirty и сделать кнопку Сохранить доступной, только если модель стала грязной. В вашей модели представления может быть свойство CanSave, которое сравнивает новое значение модели с исходным значением при загрузке модели, например:

public bool CanSave
{
  get
  {
    return this.IsDirty;     
  }
}

public bool IsDirty
{
  get
  {
    if (this.ModelPropertyValue != this.ModelOriginalPropertyValue)
    {
      return true;  
    }

    return false;
  }
}

private string modelPropertyValue;
public string ModelPropertyValue
{
  get
  {
    return this.modelPropertyValue;
  }

  set
  {
    if (this.modelPropertyValue == value) 
    {
      return;
    }

    this.modelPropertyValue = value;
    OnPropertyChanged(() => this.ModelPropertyValue);
    OnPropertyChanged(() => this.CanSave);
  }
}

Текстовые поля по умолчанию обновляют только свои связанные свойства при потере фокуса, поэтому вам необходимо установить свойство UpdateSourceTrigger в текстовом поле:

<TextBox Text="{Binding ModelPropertyValue, UpdateSourceTrigger=PropertyChanged}" />
<Button IsEnabled="{Binding CanSave}">Save</Button>
0 голосов
/ 12 января 2011

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

    <TextBox GotFocus="GotFocus"/>
    <Button Name="SaveButton" Command="{Binding SaveCommand}" IsEnabled="False">
        <TextBlock Text="Save"/>
    </Button>

then

    private void GotFocus( object sender, RoutedEventArgs e )
    {
        SaveButton.IsEnabled = true;
    }

в качестве альтернативы вы можете присоединить команду к событию GotFocus (/1272724/wpf-vyzyvaet-komandy-cherez-sobytiya) установка логического значения для модели представления, которая также запрашивается в методе CanExecute "SaveCommand".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...