4 Stimmen

Bindung an ein WPF-Kombinationsfeld in einer Listenansicht (2-Wege)

Ich habe das Problem, dass ich den ausgewählten Wert eines Kombinationsfeldes, das in einer Listenansicht eingebettet ist, binden muss. Ich habe keine Probleme bei der Anzeige von Elementen in der Combobox. Ich wünschte jedoch, ich hätte eine Möglichkeit, zu diktieren, was das Kombinationsfeld anzeigen sollte (aus den Elementen, die es enthält) auf den Klick auf eine Schaltfläche. Ich glaube, es gibt mehrere Beiträge zu diesem Thema, aber ich bin nicht in der Lage, genau das zu bekommen, was ich will. Hier ist mein Code.

XAML:

<Grid>
    <StackPanel Orientation="Vertical">
    <ListView 
        x:Name="OptionsListView" 
        ItemsSource="{Binding MyObjectCollection}">
        <ListView.Resources>
            <DataTemplate x:Key="comboBoxTemplate">
                <ComboBox 
                        Margin="0,3" 
                        x:Name="MyTypeComboBox" 
                        SelectedValue="{Binding Path=SelectedType, Mode=TwoWay}">
                    <ComboBoxItem Content="ABC"/>
                    <ComboBoxItem Content="DEF"/>
                    <ComboBoxItem Content="XYZ"/>
                </ComboBox>
            </DataTemplate>
        </ListView.Resources>
        <ListView.View>

            <GridView>
                <GridViewColumn Header="Text-Sample" 
                                    Width="100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Combo-Sample" 
                                    Width="100"
                                    CellTemplate="{StaticResource comboBoxTemplate}" />
            </GridView>
        </ListView.View>
    </ListView>
    <Button Click="Button_Click">Click Me!</Button>
    </StackPanel>
</Grid>

C# Code Behind:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        OptionsListView.DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //Something here that dictates what should be displayed in the combo box
    }

    List<MyObject> myObjectCollection = new List<MyObject>();
    public List<MyObject> MyObjectCollection
    {
        get
        {
            myObjectCollection.Add(new MyObject("One"));
            myObjectCollection.Add(new MyObject("Two"));
            return myObjectCollection;
        }
    }

}

public class MyObject : INotifyPropertyChanged
{
    private string _name;

    public MyObject(string name)
    {
        // TODO: Complete member initialization
        this._name = name;
    }

    public string Name
    {
        get
        {
            return _name;
        }
    }

    string selectedType = string.Empty;
    public string SelectedType
    {
        get
        {
            return selectedType;
        }
        set
        {
            selectedType = value;
            this.NotifyChange("SelectedType");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyChange(params object[] properties)
    {
        if (PropertyChanged != null)
        {
            foreach (string p in properties)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(p));
            }
        }
    }
    #endregion
}

Ich würde mich freuen, wenn mir jemand helfen könnte, dieses Problem zu lösen.

Danke Ram

5voto

Howard Punkte 3368

Ich bin mir nicht sicher, ob ich Ihre Frage missverstanden habe. Ich glaube, es geht Ihnen um die Frage der Referenz. Ich habe Ihren Code ein wenig geändert und es funktioniert, wenn Sie auf die Schaltfläche klicken.

Siehe den nachstehenden Code.

XAML:

<ComboBox Margin="0,3" 
    x:Name="MyTypeComboBox" 
    ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=ListBox},Path=DataContext.Sources}"
    SelectedValue="{Binding Path=SelectedType, Mode=TwoWay}">
</ComboBox>

C#-Code:

private Collection<string> sources = new Collection<string>() { "ABC", "DEF", "XYZ" };
public Collection<string> Sources { get { return sources; } }

private void Button_Click(object sender, RoutedEventArgs e)
{
    myObjectCollection[0].SelectedType = Sources[0];
    myObjectCollection[1].SelectedType = Sources[2];
}

0voto

Damascus Punkte 6395

Wie wäre es mit

foreach (ComboBox c in OptionsListView.Items)
            {
                c.SelectedValue = "Put your value here";
            }

Dies sollte die Arbeit erledigen. Wenn Sie andere Objekte als Comboboxen haben, können Sie eine

if (c is ComboBox)

um sicherzustellen, dass Sie an dem richtigen Objekt arbeiten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X