2017-07-11 4 views
0

Ich fürchte, ich habe eine dumme Frage, für die ich keine Antwort finden kann.WPF Checkbox IsEnabled Bindung

Ich versuche, einen Filter für Tags zu implementieren: Es hat ein Textfeld, in das Sie Tags eingeben können, sowie markierte und nicht markierte Kontrollkästchen. Ich möchte, dass Untagged deaktiviert wird, wenn die Textbox Text enthält.

Ich dachte, das einfach sein würde:

Meine Viewmodel:

private bool _untaggedEnabled = true; 
public UntaggedEnabled { 
    get { 
     return _untaggedEnabled; 
    } set { 
     _untaggedEnabled = value; 
     OnPropertyChanged(nameof(UntaggedEnabled)); 
    } 
} 

Codebehind Meine Ansicht ist: (ja, ich dies in XAML allein tun könnte, aber wenn ich in XAML gut waren wouldn I ‚t hier)

private void tagsList_TextChanged(object sender, TextChangedEventArgs e) { 
    _viewModel.UntaggedEnabled = !string.IsNullOrWhiteSpace(tagsList.Text); 
} 

Und meine Ansicht:

<TextBox x:Name="tagsList" Text="{Binding TagsList}" /> 
<CheckBox Content="Untagged" IsEnabled="{Binding UntaggedEnabled}" IsChecked="{Binding Untagged} /> 

Es gibt eine Reihe anderer Steuerelemente und gebundener Eigenschaften in der Komponente, die alle gut funktionieren, außer IsEnabled.

Ich kann Debug-Ausgaben überall pfeffern und alles wird entsprechend aktualisiert, wenn es soll, aber nichts auf der tatsächlichen IsEnabled-Eigenschaft.

Ich habe auch Mode=TwoWay und UpdateSourceTrigger=PropertyChanged auf die IsEnabled XAML hinzugefügt, ohne Erfolg.

Ich denke, das sollte wirklich einfach sein. Kann jemand sehen, was ich vermisse?

+0

Haben Sie eine [Datacontext] (https://msdn.microsoft.com/en-us/library/system.windows eingestellt .frameworkelement.datacontext (v = vs.110) .aspx)? – Link

+0

@Link ja - es gibt zahlreiche andere Steuerelemente, die alle an denselben Datenkontext/VM gebunden sind, die gut funktionieren. – jleach

+0

Es gibt keine Ereignisdeklaration in TextBox :) –

Antwort

1

Es gibt kein Problem mit diesem ViewModel zu binden (und zu bekommen Loswerden der Blick hinter Code-)

using System.ComponentModel; 
using System.Runtime.CompilerServices; 

public class MainViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    protected bool Set<T>(ref T storage, T value, [CallerMemberName] string propertyName = null) 
    { 
     if (Equals(storage, value)) return false; 

     storage = value; 
     OnPropertyChanged(propertyName); 
     return true; 
    } 

    string _tags; 
    bool _untagged; 

    public string Tags 
    { 
     get => _tags; set 
     { 
      if (Set(ref _tags, value)) 
      { 
       OnPropertyChanged(nameof(UntaggedEnabled)); 
      } 
     } 
    } 
    public bool Untagged { get => _untagged; set => Set(ref _untagged, value); } 
    public bool UntaggedEnabled => string.IsNullOrWhiteSpace(Tags); 
} 

Ausblick:

<TextBox 
    Text="{Binding Tags,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 
<CheckBox 
    Content="Untagged" 
    IsChecked="{Binding Untagged, Mode=TwoWay}" 
    IsEnabled="{Binding UntaggedEnabled, Mode=OneWay}"/> 
+0

Ich hatte bereits implementiert INotifiyPropertyChanged, aber wenn ich die 'OnPropertyChanged (nameof (UntaggedEnabled))' zu den Setter für die 'TagsList', es funktioniert. Ich habe keine Ahnung, warum der eigene Setter dieses Grundstücks damit nicht fertig wurde, aber ich kann zumindest jetzt weitermachen, auch wenn ich es nicht vollständig verstehe. Danke – jleach

+0

Scheint, du hast ** zwei ** Instanzen deines Viewmodels. Einer ist den Ansichten DataContext zugewiesen und der andere ist derjenige, den Sie die Eigenschaft in Code hinter setzen (in _viewModel gespeichert) –

0

Untagged sollte deaktiviert werden, wenn die Textbox in ihm einen beliebigen Text hat

Dies kann einfach und ohne Code in der Ansicht erreicht werden:

<TextBox Text="{Binding TagsList, UpdateSourceTrigger=PropertyChanged}" /> 
<CheckBox Content="Untagged" IsEnabled="{Binding IsUntaggedEnabled}"/> 

aber mit einigen in der Ansichtsmodell:

string _tagList; 
public string TagList 
{ 
    get { return _tagList; } 
    set 
    { 
     _tagList = value; 
     OnPropertyChanged(); // [CallerMemberName] 
     OnPropertyChanged(nameof(IsUntaggedEnabled)); 
    } 
} 

public bool IsUntaggedEnabled => TagList != "";