web-dev-qa-db-ja.com

WPF ComboBoxバインディングItemsSource

私はWPFの初心者であり、ComboBoxの項目を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

タイプ「System.Reflection.TargetInvocationException」の未処理の例外がPresentationFramework.dllで発生しました

誰かが私が間違っていることを教えてもらえますか?

7
LUXS

現在の実装にはいくつかの問題があります。他の人が述べたように、あなたのリストは現在NULLであり、ウィンドウのDataContextは設定されていません。

ただし、(特にWPFを使い始めたばかりなので)MVVMを使用して、より「正しい」方法でバインディングを行うことをお勧めします。

以下の簡単な例をご覧ください。

まず、DataContextWindowを設定します。これにより、XAMLViewModel内のプロパティを「表示」できるようになります。

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

次に、次のようなWindow'sバインディング要素をすべて含むViewModelクラスを設定します。

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>
14
d.moncada
   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'sItemSourceをバインドする必要がなくなります。バインディングを使用したくない場合は、

First:次を使用して、CodeBehind(ViewModel)からDataContextを設定します。

this.DataContext=this;

またはXamlから:

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

Second:ItemSourceでバインディングを使用するItemsSource="{Binding Path=cmbContent}"と同じように、INotifyPropertyChangedインターフェースの使用を検討することもできます。財産

3
ELH

cmbContentは何も設定していないため、nullです。エラーは実際にはNullReferenceExceptionだと思いますが、ビューのコンストラクターにあるため、TargetInvocationExceptionとして表示されます。

また、ItemsSourceComboBoxを2回設定しています(バインディングで1回、コンストラクターで1回)。あなたはそれをする必要はありません。一つを選ぶ。 (DataContextが設定されていないため)バインディングは記述どおりに機能しないため、コードで実行するか、DataContextをセットアップする必要があります(ナディア)。

1
Tim