2015-04-21 1 views
0

MISE À JOUR 3ne mettez pas à la fin de l'avant lors de l'écriture au sein de fonction liée ICommand

« Je veux que le texte de cette zone de texte doit être affiché dans une autre zone de texte (dans une autre vue) »

Le deuxième zone de texte dans une autre vue est destiné à montrer d'autres informations qui sont liées à la première zone de texte, mais pas la copie. Ainsi, le contrôle utilisateur contient une zone de texte pour, disons, le code de bus. Une fois que j'entre le code de bus, le tabulation déclenchera une extraction de la base de données pour d'autres détails tels que le nom du bus, la destination du bus, le modèle de bus, etc ... La boîte de texte other qui est dans une autre vue affiche alors le nom du bus. Toutes les zones de texte suivantes affichent la destination et ainsi de suite. Lorsque la commande est invoquée et que j'essaie d'écrire sur la propriété BusName, elle est assignée (et j'appelle Notify ("BusName")) mais elle n'apparaît pas sur l'interface utilisateur.

Espérons que c'était plus clair. Désolé pour toute confusion causée :).

MAJ2 - Réponse à blindmeis

Merci pour votre réponse si cela semble pas être ce que je cherchais. L'onglet est essentiel car c'est ainsi que la gestion veut que leurs pages soient peuplées, c'est-à-dire que lorsque vous saisissez une zone de texte 'code' après avoir entré le code, il utilisera le code pour extraire les données de la base de données . Cela ne semble pas avoir le comportement de tabulation en elle. Comme pour la propriété de dépendance 3, il est dans mon code d'origine, je ne l'ai simplement pas inclus ici parce que la valeur dans la première zone de texte (zone de texte de tabulation de contrôle utilisateur) n'est pas pertinente au problème. Simplement, ce que j'essaye d'accomplir est que la deuxième zone de texte doit remplir quand vous sortez de la première zone de texte.

Je pouvais le faire avec un eventhandler, mais je voulais utiliser des commandes. Je pense maintenant que peut-être les commandes ne sont pas la façon d'aller ici et je devrais passer à l'aide d'un gestionnaire d'événements. Veuillez indiquer si vous avez encore des idées sur la façon de remplir la seconde zone de texte lorsque vous mettez un onglet en dehors de la première (en plaçant un point d'arrêt dans le remplissage, vous verrez que la propriété est affectée.). Si je n'ai pas bien compris ou si j'ai manqué quelque chose ici, s'il vous plaît faites le moi savoir. Merci!

MISE À JOUR! J'ai créé une solution VS2013 imitant mon code, ce qui reproduit le problème. Il est à ce lien lecteur Google public en tant que fichier zip (prend quelques secondes pour que l'icône de téléchargement à paraître):

https://drive.google.com/file/d/0B89vOvsI7Ubdbk85SVlvT3U2dVU/view?usp=sharing

Vous verrez que la case 2e texte ne met pas à jour malgré le stockage des biens liés la nouvelle valeur.

Appréciez grandement toute aide. Merci d'avance.


Original post:

J'ai un contrôle TextBox auquel j'ai attaché une commande par clé de liaison pour aller traiter certaines actions (dans une méthode que la commande a été liée à) lorsque l'utilisateur clique onglet dans la zone de texte (onglets).

J'ai d'autres contrôles dans cette page qui sont boiund aux propriétés dans le viewmodel que j'écris dans cette fonction connectée.Quand j'écris mes propriétés dans le constructeur ou quelque part 'outside' cette invocation de commande semble fonctionner correctement et les valeurs s'affichent sur la page, mais quand je les écris dans cette invocation de commande, les propriétés dans le vm contiennent les valeurs t apparaître sur l'interface utilisateur

Des idées pourquoi et comment résoudre?

Merci beaucoup à l'avance

De XAML:

 <TextBox Name="txtCode" Text="{Binding Path=CodeValue, Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged}"> 
     <TextBox.InputBindings> 
      <KeyBinding Key="Tab" Command="{Binding RetrieveRecordCmd}" > </KeyBinding> 
     </TextBox.InputBindings> 
    </TextBox> 

De VM:

 RetrieveRecordCmd = new GSSCommand(RetrieveRecord, param => this.CanExecuteRetrieveRecordCmd); 

fonction liée de commande:

 public void RetrieveRecord(object obj) 
    { 
     objPie = null; 

     //Check if a record exists for that code 
     gssSvcMethodStatusBase = gssSvcClientBase.ReadPies(ref gssSvcGlobalVarsBase, out objPie, out grfaBase, CodeValue); 

     if ((objPie != null)) // && (objPie.DateCreated > DateTime.MinValue)) 
      PopulatePage(objPie); 
     else if (objPie == null)    
      InitiateCreateNew();    
     else    
      return;    
    } 
+1

Votre commande de commande XAML est liée à quelque chose appelé 'TextBoxTabOutCmd'. Cela existe-t-il quelque part dans votre ViewModel, ou quelque chose d'autre se passe-t-il entre cette liaison et RetrieveRecordCmd? – goobering

+0

Avez-vous cassé le point RetrieveRecord? Est-ce qu'il tire? – goobering

+0

Oui, et toutes les propriétés sont écrites – Coder2013333

Répondre

0

On dirait que vous Ai-je mplemented l'interface INotifyPropertyChanged dans le sens strict, mais manquent la fonctionnalité réelle. L'interface elle-même ne vous donne pas automatiquement les notifications de modification. Vous devez également déclencher l'événement PropertyChanged lorsque chaque propriété est modifiée. Le modèle standard ressemble:

private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name == value) 
       return; 
      _name = value; 
      NotifyPropertyChanged("Name"); 
     } 
    } 

Vous devriez faire une habitude d'écrire toutes les propriétés mutables qui vous avez l'intention de se lier à l'interface utilisateur dans ce format. Les extraits peuvent rendre cela plus facile à faire régulièrement.

+0

Merci @John Bowen a finalement eu le temps de revisiter. Je n'avais en effet pas implémenté Notify correctement. Dans ce cas, il avait implémenté légèrement différemment dans ViewModelBase. Merci pour l'aide, apprécie grandement. – Coder2013333

0

cela fonctionne, mais je ne sais pas si c'est le b Comportement que vous voulez.

<UserControl x:Class="ProblemDemoWPF.TextBoxTabOutUserControl" 
     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" 
     mc:Ignorable="d" 
     Name="TabOutTextUserControl" 
     > 
<StackPanel Margin="0,0,0,0" Orientation="Horizontal"> 
    <Label Content="UserControl (ucTextBox)->"></Label> 
    <TextBox Width="80" Height="30" BorderBrush="Black" 
          BorderThickness="2"        
         HorizontalAlignment="Center" 
         VerticalAlignment="Center" 
         Text="{Binding ElementName=TabOutTextUserControl, Path=CodeValue}"> 
    </TextBox> 
</StackPanel> 
</UserControl> 

nouvelle dépendance propriétée avec reliure à droite sans DataContext

public partial class TextBoxTabOutUserControl : UserControl 
{ 
    public static readonly DependencyProperty CodeValueProperty = 
     DependencyProperty.Register("CodeValue", typeof(string), typeof(TextBoxTabOutUserControl)); 

    public string CodeValue 
    { 
     get { return (string)GetValue(CodeValueProperty); } 
     set { SetValue(CodeValueProperty, value); } 
    } 


    public TextBoxTabOutUserControl() 
    { 
     InitializeComponent(); 
    } 
} 

Il suffit de se lier à la fois à LocTextBoxText

<Window x:Class="ProblemDemoWPF.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:loc="clr-namespace:ProblemDemoWPF" 
    Height="350" Width="525"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto"></RowDefinition> 
     <RowDefinition Height="auto"></RowDefinition> 
     <RowDefinition Height="auto"></RowDefinition> 
     <RowDefinition Height="auto"></RowDefinition> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <loc:TextBoxTabOutUserControl Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="left" 
            CodeValue="{Binding Buscode, Mode=OneWayToSource}"/> 

    <Label Content="Busname" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left"></Label> 
    <TextBox Width="100" Grid.Row="1" Grid.Column="1" Text="{Binding Path=Busname, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox> 

    <Label Content="Busdestination" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Left"></Label> 
    <TextBox Width="100" Grid.Row="2" Grid.Column="1" Text="{Binding Path=Busdestination, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox> 

    <Label Content="Busmodel" Grid.Row="3" Grid.Column="0" HorizontalAlignment="Left"></Label> 
    <TextBox Width="100" Grid.Row="3" Grid.Column="1" Text="{Binding Path=Busmodel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox> 
</Grid> 
</Window> 

ajouter Notify setter de propriété

class MainWindowViewModel : INotifyPropertyChanged 
{ 
    private String _buscode; 
    private string _busname; 
    private string _busdestination; 
    private string _busmodel; 

    public String Buscode 
    { 
     get 
     { 
      return _buscode; 
     } 
     set 
     { 
      if (_buscode != value) 
      { 
       _buscode = value; 
       Notify("Buscode"); 
       FetchData(_buscode); 
      } 
     } 
    } 

    private void FetchData(string buscode) 
    { 
     //DB stuff 
     this.Busname = "Name 1234"; 
     this.Busmodel = "Model 1234"; 
     this.Busdestination = "Destination 1234"; 

    } 

    public string Busname 
    { 
     get { return _busname; } 
     set { _busname = value; Notify("Busname"); } 
    } 

    public string Busdestination 
    { 
     get { return _busdestination; } 
     set { _busdestination = value; Notify("Busdestination"); } 
    } 

    public string Busmodel 
    { 
     get { return _busmodel; } 
     set { _busmodel = value; Notify("Busmodel"); } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    protected void Notify(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

Merci pour votre réponse si cela ne semble pas être ce que je cherchais. L'onglet est essentiel parce que c'est ainsi que la gestion veut que les pages soient remplies, c'est-à-dire lorsque vous sortez d'une zone de texte 'code' après avoir entré le code, elle utilisera le code pour remplir le reste des commandes. cela ne semble pas avoir le comportement de tabulation en elle. – Coder2013333

+0

s'il vous plaît voir ma réponse à la mise à jour à la question, il ne rentre pas ici – Coder2013333

+0

désolé je n'obtenir ce que vous voulez :(quand j'ai un UserControl avec une zone de texte et je veux que devrait montrer le texte de cette zone de texte dans une autre zone de texte (en une autre vue), puis-je utiliser la liaison simplement comme je l'ai fait dans mon exemple. la propriété viewmodel est lie au UserControl et à l'autre TextBox. et quand j'entrer du texte dans le UserControl TextBox alors le texte apparaît dans l'autre TextBox par la liaison avec le viewmodel – blindmeis