2017-05-31 5 views
-2

Ich habe überall gelesen, dass die Bindung in WPF zu Interfaces machbar ist, aber ich habe eine Menge Zeit damit, irgendeine Zugkraft damit zu bekommen. Ich benutze auch EF Core, wenn es dir hilft, meinen Code fertig zu machen. Die ComboBox füllt sich mit Daten, so dass die Bindung der Daten funktioniert, aber SelectedItem nicht binden kann, und der Text innerhalb des ausgewählten Elements leer angezeigt wird.Bind-Schnittstelle in WPF für ComboBox SelectedItem

Ich bekomme nicht wie folgt, bindet an das Objekt, das die Schnittstelle implementiert.

Die XAML für ComboBox:

<ComboBox Height="23" x:Name="cbJumpList" Width="177" Margin="2" HorizontalAlignment="Left" 
      IsEditable="False" 
      DisplayMemberPath="Name" 
      SelectedItem="{Binding Path=(model:IData.SelectedJumpList), Mode=TwoWay}" 
      /> 

MainWindow.xaml.cs:

protected IData DB { get; private set; } 
public MainWindow() 
{ 
    InitializeComponent(); 

    DB = new Data.DataSQLite(true); 
    DB.Bind_JumpLists_ItemsSource(cbJumpList); 
} 

IData.cs:

public interface IData : IDisposable, INotifyPropertyChanged 
{ 
    void Bind_JumpLists_ItemsSource(ItemsControl control); 
    IJumpList First_JumpList(); 

    IJumpList SelectedJumpList { get; set; } // TwoWay Binding 
} 

IJumpList.cs

public interface IJumpList 
{ 
    long JumpListId { get; set; } 
    string Name { get; set; } 
} 

dann innerhalb der implementierten Objekt (Data.DataSQLite):

public void Bind_JumpLists_ItemsSource(ItemsControl control) 
{ 
    control.ItemsSource = null; 

    db.JumpLists.ToList(); 
    control.ItemsSource = db.JumpLists.Local; 
    control.Tag = db.JumpLists.Local; 

    SelectedJumpList = db.JumpLists.FirstOrDefault(); 
} 

public IJumpList SelectedJumpList 
{ 
    get { return _SelectedJumpList; } 
    set 
    { 
     _SelectedJumpList = value; 
     NotifyPropertyChanged(); 
    } 
} 
IJumpList _SelectedJumpList; 

private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

ich hinzufügen sollte, bleibt das Property Ereignis null.

+0

Der Versuch, die Liste zu binden zurück von 'ToList()' Eigenschaft selectedItem? Was ist auch in "IJumpList"? –

+1

@SivaGopal Nein, die ToList aktualisiert die Eigenschaft 'Items.Local', die an anderer Stelle in einer anderen Bindung verwendet wird. Ich dachte, das könnte Verwirrung stiften, ich werde es bearbeiten. –

Antwort

0

Die Eigenschaft SelectedItem eines ComboBox soll an eine Eigenschaft und nicht an einen Typ gebunden sein. Damit die Bindung funktioniert, sollten Sie außerdem DataContext der ComboBox auf eine Instanz des Typs festlegen, für den diese Eigenschaft definiert ist.

Versuchen Sie folgendes:

<ComboBox Height="23" x:Name="cbJumpList" Width="177" Margin="2" HorizontalAlignment="Left" 
      IsEditable="False" 
      DisplayMemberPath="Name" 
      SelectedItem="{Binding SelectedJumpList}" /> 

public void Bind_JumpLists_ItemsSource(ItemsControl control) 
{ 
    db.JumpLists.ToList(); 
    control.DataContext = this; 
    control.ItemsSource = db.JumpLists.Local; 
    control.Tag = db.JumpLists.Local; 

    SelectedJumpList = db.JumpLists.FirstOrDefault(); 
} 
+1

mm8 Danke. Der 'control.DataContext = this;' für die Instanz des Typs war der Schlüssel. Das Ändern von SelectedItem spielte keine Rolle. Dein Weg hat funktioniert, und ich habe auch getan, was ich habe. Jetzt muss ich daran arbeiten, es zu bekommen, um meine andere Liste zu aktualisieren, die Änderungen betrifft, aber das ist ein großer Schlag. Ich kann nicht glauben, dass jemand es abgelehnt hat, da es die Lösung ist. –

Verwandte Themen