2017-12-22 25 views
-1

In meiner WPF-Anwendung habe ich eine ComboBox, die ich die Möglichkeit haben soll, die Auswahl von Elementen in der Dropdown-Liste programmgesteuert zu deaktivieren. Das Problem, das ich habe, ist, dass die Bindung ComboBoxItemIsEnabled nicht wie erwartet innerhalb des Setter funktioniert. Wenn Sie die Bindung entfernen und entweder True oder False verwenden, funktioniert das wie erwartet.Binding ComboBoxItem Wert innerhalb einer Setter-Eigenschaft in WPF MVVM

XAML

<ComboBox 
    ItemsSource="{Binding Path=ConfigItems.Result}" 
    DisplayMemberPath="Name" 
    IsEditable="True" 
    FontSize="14" 
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
    IsTextSearchEnabled="False" 
    Text="{Binding Path=ConfigItem, 
      UpdateSourceTrigger=LostFocus, 
      TargetNullValue={x:Static sys:String.Empty}}" 
    b:ComboBoxBehaviors.OnButtonPress="True"> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="ComboBoxItem"> 
      <Setter Property="IsEnabled" Value="{Binding ComboBoxItemIsEnabled}" /> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

C#

private string _comboBoxItemIsEnabled = "True"; 

public string ComboBoxItemIsEnabled 
{ 
    get 
    { 
     return this._comboBoxItemIsEnabled; 
    } 
    set 
    { 
     this.SetProperty(ref this._comboBoxItemIsEnabled, value); 
    } 
} 

public async Task<ConfigItem[]> LoadConfigItemsAsync(string partialName) 
{ 
    try 
    { 
     if (partialName.Length >= 5) 
     { 
      this.ComboBoxItemIsEnabled = "True"; 
      return await this._Service.GetConfigItemsAsync(partialName); 
     } 
     this.ComboBoxItemIsEnabled = "False"; 
     return new[] { new ConfigItem("Minimum of 5 characters required", null)}; 
    } 
    catch (Exception) 
    { 
     this.ComboBoxItemIsEnabled = "False"; 
     return new[] { new ConfigItem("No results found", null) }; 
    } 
} 

ich auch die folgende Fehlermeldung von der Debug-Konsole, wenn die ComboBoxIsEnabled gesetzt wird.

System.Windows.Data Error: 40 : BindingExpression path error: 'ComboBoxItemIsEnabled' property not found on 'object' ''ConfigItem' (HashCode=56037929)'. BindingExpression:Path=ComboBoxItemIsEnabled; DataItem='ConfigItem' (HashCode=56037929); target element is 'ComboBoxItem' (Name=''); target property is 'IsEnabled' (type 'Boolean') 

Ich bin mit der gleichen mvvm Methode eine IsEnabled Eigenschaft für eine Schaltfläche zum Ziel sonst wo, ohne ein Problem. Der einzige Unterschied, den ich in dem obigen Problem sehen kann, ist, dass ich die Eigenschaft stattdessen innerhalb eines Setter setze.

Vielen Dank für jede Weisheit, die Sie lösen können, um dieses Problem zu lösen.

+1

Versuchen Sie mit Bool statt String – sTrenat

+0

@sTrenat Danke für die Antwort, werde ich auf jeden Fall geben. Ich hatte gedacht, dass es die Ursache sein könnte, aber ich habe es als eine andere Kontrolle abgewiesen, die es nicht von mir verlangte. – Sabre

+0

Wenn jemand anderes meine Frage abstimmen möchte, hinterlasse bitte einen Kommentar für ihren Grund. Es scheint schrecklich sinnlos zu sein, und ich sehe nicht wirklich, was mit meiner Frage falsch ist. – Sabre

Antwort

0

Nach viel Zaudern und Kopfschütteln gegen die Tastatur gelang es mir, zu einer Lösung zu kommen. Wie sich herausstellte, musste ich die relative Quelle für die Bindung einstellen. Da ich den DataContext für meine Lösung nicht definiert habe, wurde jedes Mal, wenn ich ein Zeichen in der Combobox gedrückt habe, die ItemSource aktualisiert. Das bedeutet, dass die ComboBoxItemIsEnabled-Bindung nicht gefunden wurde, was den obigen Fehler ergibt. Unten ist mein aktualisierter Code, ich habe DataContext vor meiner Bindung hinzugefügt und hinzugefügt RelativeSource = {RelativeSource AncestorType = ComboBox} dahinter.

Unten ist mein endgültiger Code.

<ComboBox.ItemContainerStyle> 
    <Style TargetType="ComboBoxItem"> 
     <Setter Property="IsEnabled" Value="{Binding DataContext.ComboBoxItemIsEnabled, RelativeSource={RelativeSource AncestorType=ComboBox}}" /> 
    </Style> 
</ComboBox.ItemContainerStyle>