- - - -編集 - - -
だから、私は私のコードが正しいと思いました、そしてあなたのすべての答えからのコードスニペットも正しいと思いました。それをありがとう。私の問題は、私のdev-maschineが異なる動作をする.NET4.5を実行していることです!まったく同じプログラム(.NET4.0に対してコンパイルされたもの)は、.NET4.0のマシンでは正しく実行されますが、.NET4.5のマシンでは正しく実行されません。
だからここに私の改訂された質問があります。
- - - -編集 - - -
まず、コンボボックスをデータコンテキストに双方向でバインドする簡単な例を次に示します。
モデルを見る:
public class MainWindowViewModel
{
public List<String> MyElements { get; set; }
public string SelectedElement { get; set; }
public MainWindowViewModel()
{
MyElements = new List<string>() {"a", "b", "c"};
SelectedElement = "a";
}
}
およびコードビハインド
private readonly MainWindowViewModel _viewModel = new MainWindowViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = _viewModel;
}
と私のxaml
<ComboBox
ItemsSource="{Binding MyElements, Mode=OneWay}"
SelectedItem="{Binding SelectedElement}" />
これは正常に機能し、コンボボックスでアイテムを選択すると、ビューモデルにバインドされます。
OK、今度はviewModelを静的にしたいのですが、それでもselectedItemを双方向でバインドします。私はこれを試してみます:
public class MainWindowViewModel
{
public static List<String> MyElements { get; set; }
public static string SelectedElement { get; set; }
static MainWindowViewModel()
{
MyElements = new List<string>() {"a", "b", "c"};
SelectedElement = "a";
}
}
コードビハインドでデータコンテキストを設定する必要はもうありません。xamlには双方向バインディング用のインスタンスが必要であることがわかっているので、デフォルトのコンストラクターを使用しています。次に、コンボボックスをバインドします
<Window.Resources>
<me:MainWindowViewModel x:Key="model"/>
</Window.Resources>
<StackPanel>
<ComboBox
ItemsSource="{Binding Source={x:Static me:MainWindowViewModel.MyElements}, Mode=OneWay}"
SelectedItem="{Binding Source={StaticResource model}, Path=SelectedElement}" />
</StackPanel>
初期値は適切にバインドされていますが、コンボボックスで別のアイテムを選択すると、viewModelに反映されません。私は何が間違っているのですか?
編集:
TextBoxにまったく同じバインディング文字列を使用し、ボックス内のテキストを変更すると、プロパティに反映されます。
<TextBox Text="{Binding Source={StaticResource model}, Path=SelectedElement}"/>
したがって、明らかに私のバインディング文字列は正しいですが、コンボボックスの使用方法が間違っているようです。SelectedValue
私も代わりにバインドしようとしました...変更もありません。