簡體   English   中英

WPF ComboBox綁定ItemsSource

[英]WPF ComboBox binding ItemsSource

我是WPF的初學者,並試圖將ComboBox的Items綁定到ObservableCollection

我用過這段代碼:

XAML

<Window x:Class="comboBinding2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox x:Name="cmbTest" ItemsSource="{Binding Path=cmbContent}" Width="200" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Grid>
</Window>

C#

public MainWindow()
{
    cmbTest.ItemsSource = cmbContent;
    cmbContent.Add("test 1");
    cmbContent.Add("test 2");

    InitializeComponent();
}

public ObservableCollection<string> cmbContent { get; set; }

在我嘗試調試之前,我沒有在此代碼上出現任何錯誤,它會拋出錯誤:

TargetInvocationError

PresentationFramework.dll中出現未處理的“System.Reflection.TargetInvocationException”類型異常

誰能告訴我我做錯了什么?

您當前的實施有一些問題。 正如其他人所說,您的列表當前為NULL ,並且未設置Window的DataContext

雖然,我建議(特別是因為你剛剛開始使用WPF)學習使用MVVM以更“正確”的方式進行綁定。

請參閱下面的簡化示例:

首先,您要設置WindowDataContext 這將允許XAML “查看” ViewModel的屬性。

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }
}

接下來,只需設置一個ViewModel類,它將包含所有Window's綁定元素,例如:

public class ViewModel
{
    public ObservableCollection<string> CmbContent { get; private set; }

    public ViewModel()
    {
        CmbContent = new ObservableCollection<string>
        {
            "test 1", 
            "test 2"
        };
    }
}

最后,更新您的XAML以便綁定路徑與集合匹配:

<Grid>
    <ComboBox Width="200"
          VerticalAlignment="Center"
          HorizontalAlignment="Center"
          x:Name="cmbTest"
          ItemsSource="{Binding CmbContent}" />
</Grid>
   public MainWindow()
    {

        InitializeComponent();
        cmbContent=new ObservableCollection<string>();
        cmbContent.Add("test 1");
        cmbContent.Add("test 2");
        cmbTest.ItemsSource = cmbContent;

    }
    public ObservableCollection<string> cmbContent { get; set; }

上面的代碼不使用任何綁定,這意味着使用它不需要綁定Combobox's ItemSource ,如果你不想使用綁定你需要

第一步 :使用以下命令從CodeBehind(ViewModel)設置DataContext:

this.DataContext=this;

或者來自Xaml:

DataContext="{Binding RelativeSource={RelativeSource Self}}">

第二 :在ItemSource中使用Binding就像你使用ItemsSource="{Binding Path=cmbContent}" ,如果你想在屬性發生任何變化時通知UI,你也可以考慮使用INotifyPropertyChanged接口。

cmbContent為null,因為您從未將其設置為任何內容。 我猜這個錯誤實際上是一個NullReferenceException ,但是它顯示為TargetInvocationException因為它位於視圖的構造函數中。

此外,您將兩次設置ComboBoxItemsSource (一次在綁定中,一次在構造函數中)。 你不需要這樣做。 選一個。 您的綁定將無法DataContext編寫方式工作(因為未設置DataContext ),因此您應該在代碼中執行此操作,或者設置DataContext (如Nadia所建議的那樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM