2016-10-17 2 views
-2

Ich habe eine "Checked ListBox", eine ListBox mit einer CheckBox für jedes meiner Artikel.
In diesem ListBox habe ich eine Liste der Spieler.WPF Bindung an eine Funktion zurück

<ListBox ItemsSource="{Binding MyPlayers}" SelectedItem="{Binding SelectedPlayer}" Margin="69,51,347.4,161.8"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ListBoxItem> 
       <CheckBox IsChecked="{Binding ???}" Content="{Binding Path=Pseudo}" /> 
      </ListBoxItem> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Ansichtsmodell:

public class MainWindowViewModel : BaseViewModel 
{ 
    SavingContext MyDatabaseContext; 
    public ObservableCollection<Player> MyPlayers 
    { 
     get 
     { 
      return MyDatabaseContext.MyPlayers.Local; 
     } 
    } 

    Tournament _MyTournament; 
    public Tournament MyTournament 
    { 
     get 
     { 
      return _MyTournament; 
     } 

     set 
     { 
      _MyTournament = value; 
     } 
    } 

    public MainWindowViewModel(Tournament myTournament) 
    { 
     MyDatabaseContext = new SavingContext(); 
     MyDatabaseContext.MyPlayers.Load(); 
     MyTournament = myTournament; 
    } 
} 

Ich gehe in meinem ViewModel ein Tournament, die eine HashSet von PlayersParticipants genannt enthält.
Ich möchte meine IsChecked Eigenschaften an das Ergebnis von MyTournament.Participants.Contains(this) binden mit dieser ist die Player bezogen auf die CheckBox. Aber ich kann es nicht schaffen.

Edit:
Ich habe versucht, einen Konverter zu verwenden, aber mit keinem Erfolg. <helper:PlayerToTournamentRegistered x:Key="PlayerToTournamentRegistered" />

<ListBoxItem> 
    <CheckBox IsChecked="{Binding Converter={StaticResource PlayerToTournamentRegistered}}" Content="{Binding Path=Pseudo}" /> 
</ListBoxItem> 

public class PlayerToTournamentRegistered : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //Temp test to see if it would work 
     if (value == null) return false; 

     return true; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Ich erhalte eine Fehlermeldung jedes Mal Provide value on 'System.Windows.Data.Binding' threw an exception
Irgendwelche Hinweise?

+0

Es ist unmöglich, ohne eine gute [MCVE] eine Beratung zur Verfügung zu stellen, die deutlich zeigt, was Sie haben versucht, und was nicht funktioniert. Datenverbindungsanforderungen sind einfach: Öffentliche Eigenschaften, die von Benachrichtigungen über Eigenschaftenänderungen unterstützt werden. Ein Konverter muss funktionieren, ohne Exceptions zu werfen, und Converter-Inputs müssen weiterhin Property Change-Benachrichtigungen haben, damit WPF weiß, wann der Converter ausgeführt werden soll. Wenn das Sie nicht wieder auf Kurs bringt, reparieren Sie bitte Ihre Frage, damit sie die benötigten Informationen enthält. –

+0

Ich weiß nicht, was fehlt, um ein minimales, komplettes und überprüfbares Beispiel zu haben, ein Appart für die MVVM-Implementierung, die klassisch ist, und die Entitäts-Framework-Struktur (die ich im Detail darlege). Sie können den Rest in einem neuen Projekt hinzufügen, um das gleiche reproduzierbare Beispiel zu erhalten. – Belterius

+0

_ "Ich weiß nicht, was für ein minimales, vollständiges und verifizierbares Beispiel fehlen würde" _ - dann hast du die [mcve] Seite nicht gelesen. Siehe auch die Artikel, die unten auf der [ask] Seite verlinkt sind (und natürlich, lies das auch). Was fehlte, war, dass Sie nicht einmal die "Turnier" - oder "Spieler" -Klassen einbezogen haben, geschweige denn ein Codebeispiel, das sowohl ** vollständig ** als auch ** minimal ** ist. –

Antwort

0

Also habe ich es geschafft, es mit einem MultiConverter arbeiten zu lassen.
Der erste Fehler, den ich hatte, war aufgrund der Tatsache, dass der Modus standardmäßig Two Way ist, möchte ich nur meinen Konverter funktionieren OneWay.
Ich habe eine MultiBinding verwendet, um sowohl mein ListBoxItem als auch mein Turnier an meinen Converter zu senden.
Mein Konverter gibt true oder false zurück und ist mit meinen CheckBox.IsChecked-Eigenschaften verknüpft.

List Box:

<ListBox ItemsSource="{Binding MyPlayers}" SelectedItem="{Binding SelectedPlayer}" Margin="69,51,347.4,161.8"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ListBoxItem> 
       <CheckBox Content="{Binding Path=Pseudo}" > 
        <CheckBox.IsChecked> 
         <MultiBinding Converter="{StaticResource PlayerToTournamentRegistered}" Mode="OneWay"> 
          <Binding /> 
          <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Window}" Path="DataContext.MyTournament"/> 
         </MultiBinding> 
        </CheckBox.IsChecked> 
       </CheckBox> 
      </ListBoxItem> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Converter:

public class PlayerToTournamentRegistered : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if(!(values[0] is Student) || !(values[1] is Tournament)) 
     { 
      return false; 
     } 
     Tournament myTournament = (Tournament)values[1]; 
     Student myPlayer = (Student)values[0]; 
     if (myTournament.Participants.Contains(myPlayer)) 
      return true; 
     return false; 
    } 
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
}