2013-04-24 3 views
2

У меня есть TextBox в DataTemplate объявлен следующим образом:Как очистить TextBox в MVVM?

<TextBox Grid.Row="1" Grid.Column="1" Margin="0,4,0,0"> 
<i:Interaction.Triggers> 
    <i:EventTrigger EventName="LostFocus"> 
     <cmd:EventToCommand Command="{Binding DataContext.NotesEnteredCommand, 
          RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"> 
      <cmd:EventToCommand.CommandParameter> 
       <MultiBinding Converter="{StaticResource SimpleMultiValueConverter}"> 
        <Binding Path="Row.OID" /> 
        <Binding Path="Text" RelativeSource="{RelativeSource FindAncestor, AncestorType=TextBox}" /> 
       </MultiBinding> 
      </cmd:EventToCommand.CommandParameter> 
     </cmd:EventToCommand> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

<TextBox.InputBindings> 
    <KeyBinding Key="Enter" Command="{Binding DataContext.NotesEnteredCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"> 
     <KeyBinding.CommandParameter> 
      <MultiBinding Converter="{StaticResource SimpleMultiValueConverter}"> 
       <Binding Path="Row.OID" /> 
       <Binding Path="Text" RelativeSource="{RelativeSource FindAncestor, AncestorType=TextBox}" /> 
      </MultiBinding> 
     </KeyBinding.CommandParameter> 
    </KeyBinding> 
</TextBox.InputBindings> 

Что это TextBox в основном делает это выполнить MVVM-Light RelayCommand когда клавиша Enter нажата или при потере фокуса.

Моя проблема заключается в том, что я не могу определить способ в MVVM, чтобы очистить значение TextBox Text через XAML в двух вышеупомянутых сценариях. Это очень легко с кодом, но я не могу понять это в MVVM.

Любые идеи?

+0

Создайте привязку для свойства 'Text'' TextBox' к свойству в ViewModel, установите свойство "" и текст 'TextBox' будет очищен? – Viv

+0

Я не могу иметь его в ViewModel, мои строки привязаны к DataView, для чего мне потребуется столбец только для этой цели. Но спасибо за ответ :) – user2170838

+0

@ user2170838 Не забывайте, что вы можете использовать что-то вроде привязки RelativeSource для привязки к чему-то другому, кроме текущего DataContext, например, «Text =» {Binding RelativeSource = {RelativeSource AncestorType = {x : Введите DataGrid}}, Path = DataContext.NewNoteText} ", где' DataContext' вашего 'DataGrid' содержит как' DataView', так и свойство string для нового текста заметки.Конечно, это работает только в том случае, если текст статичен независимо от того, на какую строку нажата :) – Rachel

ответ

2

Если текст является частью вашего уровня данных и логики приложения, строка должна существовать в вашем Model или ViewModel и быть очищены от там

Например,

<TextBox Text="{Binding NewNote}" ... /> 

и

void NotesEntered(int oid) 
{ 
    SaveNewNote(oid); 

    NewNote = string.Empty; 
} 

Если это часть слоя пользовательского интерфейса, его следует просто очистить с помощью кода. Вполне приемлемо иметь UI-специфическую логику в коде за интерфейсом, поскольку он все еще поддерживает разделение слоев.

NewNoteTextBox_LostFocus(object sender, EventArgs e) 
{ 
    (sender as TextBox).Text = string.Empty; 
} 

NewNoteTextBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Keys.Enter) 
     (sender as TextBox).Text = string.Empty; 
} 
+0

Я был обеспокоен тем, что использование кода-кода приведет к поражению цели MVVM, но вы правы, что не взаимодействует с ViewModel, поэтому должно быть прекрасно :) – user2170838

0

Вы можете использовать UpdateSourceHelper. Это действительно помогло мне вызывать событие без кода. Смотрите здесь http://www.wiredprairie.us/blog/index.php/archives/1701

Все, что вам нужно сделать, это создать класс «UpdateSourceHelper», соедините его с XAML, как этот

xmlns:local="using:WiredPrairie.Converter 

и привязать его к TextBox (или что вы хотите связать с) ...

<TextBox Height="Auto" Margin="0,6" Grid.Row="1" TextWrapping="Wrap" TabIndex="0" 
    Text="{Binding Value}" 
    local:UpdateSourceHelper.IsEnabled="True" 
    local:UpdateSourceHelper.UpdateSourceText="{Binding Value, Mode=TwoWay}"/> 

Если вы хотите позвонить LostFocus событие в Helper, вы должны просто добавить эти 2 строки в помощнике:

tb.LostFocus += AttachedTextBoxLostFocus; 
tb.LostFocus -= AttachedTextBoxLostFocus; 

Так это будет выглядеть так:

TextBox tb = (TextBox)obj; 
    if ((bool)args.NewValue) 
     {       
      tb.LostFocus += AttachedTextBoxLostFocus; 
     } 
    else 
     { 
      tb.LostFocus -= AttachedTextBoxLostFocus; 
     } 

правой кнопкой мыши на AttachedTextBoxLostFocus и генерировать метод. Теперь вы можете обрабатывать событие как событие с кодом.

Смежные вопросы