Laden...

StackPanel Visibility bei DataBinding

Erstellt von Ahrimaan vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.199 Views
A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 11 Jahren
StackPanel Visibility bei DataBinding

Hallo zusammen,
ich habe eine Frage zu einem Phänomen:

<StackPanel Visibility="{Binding IsVisible,Converter={StaticResource converter}}"  Orientation="Vertical" Grid.Row="1" DataContext="{Binding CurrentItem}">
            <TextBlock Text="{Binding Name}"/>
            <Label Content="Bitte geben Sie einen Text ein"/>
            <TextBox TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" AcceptsReturn="True" Text="{Binding CurrentItem,Path=Comment,UpdateSourceTrigger=PropertyChanged}"/>
            <Button Content="Speichern" Command="{Binding SaveCommand}"/>
        </StackPanel>

Die IsVisible Eigenschaft wird Anfangs auf false gesetzt und das CurrentItem ist definiv null.
Wenn ich den DataContext angebe, schaltet er nicht mehr auf True oder False (logisch da kein DataContext)
Wenn ich den aber entferne und direkt in den Controls darauf verweise, findet er die Property Current Item nimmer.

Etwas Ratlos bin

EDIT : Das ViewModel

private ObservableCollection<TaskModel> _internalTasks; 

        private CollectionViewSource _tasks;
        public ICollectionView Tasks
        {
            get { return _tasks.View; }
            set { OnPropertyChanged(() => Tasks); }
        }

        private TaskModel _currentItem;
        public TaskModel CurrentItem
        {
            get { return _currentItem; }
            set { _currentItem = value;
                IsVisible = _currentItem != null;
                OnPropertyChanged(() => CurrentItem);
            }
        }

        private bool _isVisible;
        public bool IsVisible
        {
            get { return _isVisible; }
            set { _isVisible = value;OnPropertyChanged(() => IsVisible); }
        }

        private ICommand _saveCommand;
        public ICommand SaveCommand
        {
            get
            {
                return _saveCommand ?? (_saveCommand = new DelegateCommand(() =>
                                                                               {
                                                                                   var result = _currentItem.Comment;
                                                                               }));
            }
        }
P
992 Beiträge seit 2007
vor 11 Jahren

Wie sieht denn dein ViewModel aus?
Den DataContext musst du auf ein ViewModel setzen, welches die Properties IsVisible und CurrentItem enthält.

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 11 Jahren

Ich habe in meine AppDictionary bereits die View und das ViewModel verbunden.
Beide Propertys sind da.
Nur findet das Stackpanel nicht.
Ein DataGrid im selben Control bindet aber ganz normal ..

5.658 Beiträge seit 2006
vor 11 Jahren

Hi Ahrimaan,

gibt es DataBinding-Fehlermeldungen im Ausgabefenster?

Christian

Weeks of programming can save you hours of planning

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 11 Jahren

Hi Ahrimaan,

gibt es DataBinding-Fehlermeldungen im Ausgabefenster?

Christian

Hi Christian,

wenn der DataContext weg ist , findet er CurrentItem nicht.
Wenn er den DataContext hat, findet er IsVisible nicht.

Ich war immer der Meinung, alle Controls können auf die in dem VM enthaltene Propertys zugreifen.
Sobald ich aber den DataContext aus dem StackPanel entferne scheint dem nicht so.

EDIT: Habe mal das ViewModel im obigen Beitrag gepostet

Grüße

5.658 Beiträge seit 2006
vor 11 Jahren

Hi Ahrimaan,

ein paar Fragen hast du aufgeworfen:

  • Heißt die gepostete Klasse TaskModel?
  • Kannst du ausschließen, daß CurrentItem einfach null ist?
  • Kennst du den DatabindingDebugConverter schon:

/// <summary>
/// This converter does nothing except breaking the
/// debugger into the convert method
/// </summary>
public class DatabindingDebugConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        Debugger.Break();
        return value;
    }
 
    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        Debugger.Break();
        return value;
    }
}

Christian

Weeks of programming can save you hours of planning

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 11 Jahren

Hi Ahrimaan,

ein paar Fragen hast du aufgeworfen:

  • Heißt die gepostete Klasse TaskModel?
  • Kannst du ausschließen, daß CurrentItem einfach null ist?
  • Kennst du den
    >
    schon:
  
/// <summary>  
/// This converter does nothing except breaking the  
/// debugger into the convert method  
/// </summary>  
public class DatabindingDebugConverter : IValueConverter  
{  
    public object Convert(object value, Type targetType,   
        object parameter, CultureInfo culture)  
    {  
        Debugger.Break();  
        return value;  
    }  
   
    public object ConvertBack(object value, Type targetType,   
        object parameter, CultureInfo culture)  
    {  
        Debugger.Break();  
        return value;  
    }  
}  
  

Christian

Hi,
die gepostete Klasse ist das ViewModel.
TaskModel ist das Model welches meine Daten enthält.

Ja kann ich : Wenn ich mit dem Debugger reinspringe, sehe ich, wie der Wert zugewiesen wird.

Diese Klasse kannte ich bisher noch nicht
Grüße

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 11 Jahren

Ahhh Ahh ..

Sorry manchmal könnte ich mich für meine eigene Dummheit schlagen :

Man sollte die Property und die SubProperty auch angeben

<StackPanel Visibility="{Binding IsVisible,Converter={StaticResource BooleanToVisiblityConverter}}"  Orientation="Vertical" Grid.Row="1">
            <TextBlock Text="{Binding CurrentItem.Name}"/>
            <Label Content="Bitte geben Sie einen Text ein"/>
            <TextBox TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" AcceptsReturn="True" Text="{Binding CurrentItem.Comment,UpdateSourceTrigger=PropertyChanged}"/>
            <Button Content="Aufgabe schließen" Command="{Binding SaveCommand}"/>
        </StackPanel>