Frage

Hier ist meine Bindung Quellobjekt:

Public Class MyListObject

    Private _mylist As New ObservableCollection(Of String)
    Private _selectedName As String

    Public Sub New(ByVal nameList As List(Of String), ByVal defaultName As String)

        For Each name In nameList
            _mylist.Add(name)
        Next

        _selectedName = defaultName

    End Sub

    Public ReadOnly Property MyList() As ObservableCollection(Of String)
        Get
            Return _mylist
        End Get
    End Property

    Public ReadOnly Property SelectedName() As String
        Get
            Return _selectedName
        End Get
    End Property

End Class

Hier ist meine XAML:

<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    xmlns:local="clr-namespace:WpfApplication1"
        >

    <Window.Resources>
        <ObjectDataProvider x:Key="MyListObject" ObjectInstance="" />
    </Window.Resources>

        <Grid>

        <ComboBox Height="23"
                  Margin="24,91,53,0"
                  Name="ComboBox1"
                  VerticalAlignment="Top"
                  SelectedValue="{Binding Path=SelectedName, Source={StaticResource MyListObject}, Mode=OneWay}"
                  ItemsSource="{Binding Path=MyList, Source={StaticResource MyListObject}, Mode=OneWay}"
                  />

        <Button Height="23"
                HorizontalAlignment="Left"
                Margin="47,0,0,87"
                Name="btn_List1"
                VerticalAlignment="Bottom"
                Width="75">List 1</Button>

        <Button Height="23"
                Margin="0,0,75,87"
                Name="btn_List2"
                VerticalAlignment="Bottom"
                HorizontalAlignment="Right"
                Width="75">List 2</Button>
    </Grid>
</Window>

Hier ist der Code-behind:

Class Window1

    Private obj1 As MyListObject
    Private obj2 As MyListObject
    Private odp As ObjectDataProvider

    Public Sub New()

        InitializeComponent()

        Dim namelist1 As New List(Of String)
        namelist1.Add("Joe")
        namelist1.Add("Steve")
        obj1 = New MyListObject(namelist1, "Steve")
.
        Dim namelist2 As New List(Of String)
        namelist2.Add("Bob")
        namelist2.Add("Tim")
        obj2 = New MyListObject(namelist2, "Tim")

        odp = DirectCast(Me.FindResource("MyListObject"), ObjectDataProvider)
        odp.ObjectInstance = obj1

    End Sub

    Private Sub btn_List1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_List1.Click

        odp.ObjectInstance = obj1

    End Sub

    Private Sub btn_List2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_List2.Click

        odp.ObjectInstance = obj2

    End Sub
End Class

Wenn das Fenster zum ersten Mal geladen, die Bindungen feinen Haken. Die ComboBox enthält den Namen „Joe“ und „Steve“ und „Steve“ ist standardmäßig aktiviert. Allerdings, wenn ich auf einen Knopf klicken Sie auf die ObjectInstance wechseln obj2, wird die ComboBox Itemssource korrekt in der Drop-Down-bevölkert, aber der SelectedValue wird auf Nothing statt gleich obj2.SelectedName zu sein.

War es hilfreich?

Lösung

Wir hatten ein ähnliches Problem letzte Woche. Es hat zu tun, wie SelectedValue aktualisiert seine Einbauten. Was wir fanden, war, wenn Sie SelectedValue eingestellt es nicht um die Änderung sehen würden wir stattdessen setzen SelectedItem musste die alles richtig aktualisieren würde. Meine Schlussfolgerung ist, dass SelectedValue ist die für get Operationen und nicht gesetzt . Aber das kann nur ein Fehler in der aktuellen Version von seinem 3.5sp1 .net

Andere Tipps

Um ein 2 Jahre altes Gespräch aufrühren:

Eine andere Möglichkeit, wenn Sie Zeichenfolgen verwenden wollen, sind, ist es für die Text-Eigenschaft des ComboBox zu binden.

<ComboBox Text="{Binding Test}">
     <ComboBoxItem Content="A" />
     <ComboBoxItem Content="B" />
     <ComboBoxItem Content="C" />
</ComboBox>

Das ist gebunden an so etwas wie:

public class TestCode
{
    private string _test;
    public string Test 
    { 
      get { return _test; }
      set
      {
         _test = value;
         NotifyPropertyChanged(() => Test); // NotifyPropertyChanged("Test"); if not using Caliburn
      }
    }
}

Der obige Code ist Zwei-Wege also, wenn Sie Test = „B“ eingestellt; in Code dann wird die Combobox zeigt ‚B‘, und dann, wenn Sie ‚A‘ aus dem Dropdown dann die gebundene Eigenschaft reflektiert die Änderung aus.

Mit

UpdateSourceTrigger=PropertyChanged 

in der Bindung

Problem:

Die ComboBox-Klasse sucht nach dem angegebenen Objekt durch die IndexOf-Methode. Diese Methode verwendet die Methode Equals Gleichheit zu bestimmen.

Lösung:

Also, versuchen Sie SelectedIndex mit SelectedValue über Converter wie folgt festgelegt:

C # -Code

//Converter

public class SelectedToIndexConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && value is YourType)
            {
                YourType YourSelectedValue = (YourType) value;

                YourSelectedValue = (YourType) cmbDowntimeDictionary.Tag;
                YourType a = (from dd in Helper.YourType
                                        where dd.YourTypePrimaryKey == YourSelectedValue.YourTypePrimaryKey
                                        select dd).First();

                int index = YourTypeCollection.IndexOf(a); //YourTypeCollection - Same as ItemsSource of ComboBox
            }
            return null;
        }
         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value!=null && value is int)
            {
                return YourTypeCollection[(int) value];
            }

            return null;
        }
    }

XAML

<ComboBox 
   ItemsSource="{Binding Source={StaticResource YourDataProvider}}"
   SelectedIndex="{Binding Path=YourValue, Mode=TwoWay, Converter={StaticResource SelectedToIndexConverter}, UpdateSourceTrigger=PropertyChanged}"/>

Viel Glück! :)

Der Typ des SelectedValuePath und der SelectedValue muss genau gleich sein.

Wenn zum Beispiel der Art der SelectedValuePath ist Int16 und die Art der Eigenschaft, ist SelectedValue an int bindet es nicht funktionieren wird.

Ich verbringe Stunden, die zu finden, und das ist, warum ich hier bin zu beantworten, nachdem so viel Zeit wurde die Frage gestellt. Vielleicht wie ich eine anderer armer Kerl mit dem gleichen Problem kann es sehen.

Lief in etwas Ähnliches, schließlich habe ich nur für den Rückgang auf das Selection Ereignis abonniert nach unten und meine Daten Eigenschaft mit ihm. Dummes und wünschte, es war nicht nötig, aber es funktioniert.

Ist es sinnvoll, die SelectedValuePath = „Content“ in der Combobox der XAML zu setzen, und dann SelectedValue als die Bindung verwenden?

Es scheint, dass Sie eine Liste von Strings haben und wollen die Bindung an nur String-Matching gegen den Artikel Inhalt in der Combobox tun, also wenn Sie ihm sagen, welche Eigenschaft für das SelectedValue verwenden sollte es funktionieren; zumindest, dass für mich gearbeitet, wenn ich über dieses Problem lief.

Es scheint, als Inhalt ein vernünftiger Standard für SelectedValue sein würde, aber vielleicht ist es nicht?

Haben Sie versucht, ein Ereignis auslöst, die SelectName signalisiert wird aktualisiert, zum Beispiel OnPropertyChanged ( „SelectedName“)? Das funktionierte für mich.

In meinem Fall habe ich auf eine Liste verbindlich war, während ich in einen String verbindlich sein sollte.

Was ich tat:

private ObservableCollection<string> _SelectedPartyType;

public ObservableCollection<string> SelectedPartyType { get { return 
_SelectedPartyType; } set { 
             _SelectedPartyType = value; OnPropertyChanged("SelectedPartyType"); } }

Was sollte      

 private string _SelectedPartyType;

 public string SelectedPartyType { get { return _SelectedPartyType; } set { 
             _SelectedPartyType = value; OnPropertyChanged("SelectedPartyType"); } }

Der Bindungsmodus muss OneWayToSource oder TwoWay sein, da die Quelle ist, was Sie aktualisiert werden soll. Modus OneWay ist die Quelle zum Ziel und macht daher die Quelle, die in Readonly nie ergibt sich die Quelle zu aktualisieren.

Sie wissen ... Ich habe stundenlang heute mit diesem Problem gekämpft, und Sie wissen, was ich herausgefunden habe? Es war eine Datatype Ausgabe! Die Liste, die die ComboBox wurde bevöl war Int64, und ich versuche, den Wert in einem Int32 Feld zu speichern! Es wurden keine Fehler geworfen, es war einfach nicht die Werte zu speichern!

Nur soviel gelöst. Huh !!! Verwenden Sie entweder [one of ...] .SelectedValue | .SelectedItem | .SelectedText Tipp:. Gewählte Wert wird für ComboStyle.DropDownList bevorzugt, während .SelectedText für ComboStyle.DropDown ist

-Dies sollte Ihr Problem lösen. hat mich mehr als eine Woche dieses kleine fyn zu lösen. hah !!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top