------- ------ EDIT
所以,我认为我的代码是正确的,所有答案中的代码片段都是正确的。感谢那。我的问题是我的dev-maschine运行.NET4.5,其行为不同!同样的程序(针对.NET4.0编译)在使用.NET4.0的机器上运行正确,但在使用.NET4.5的机器上运行不正确!
所以这是我修订的question。
------- ------ EDIT
首先,我将组合框双向绑定到数据上下文的简单示例:
查看型号:
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}" />
这很好用,如果我选择了一个带有组合框的项目,它就会绑定到我的视图模型。
好的,现在我想让我的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";
}
}
我不需要在Code-behind中设置datacontext了,我知道,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
而不是......也没有改变。
答案 0 :(得分:4)
仅在示例项目中检查,工作正常
public class ViewModel
{
static ViewModel()
{
Items=new ObservableCollection<string>();
SelectedItem = "222";
Items.Add("111");
Items.Add("222");
Items.Add("333");
Items.Add("444");
Items.Add("555");
}
private static string _selectedItem;
public static string SelectedItem
{
get { return _selectedItem; }
set { _selectedItem = value;
MessageBox.Show("Item " + value + " was selected");
}
}
private static ObservableCollection<string> _items;
public static ObservableCollection<string> Items
{
get { return _items; }
set { _items = value; }
}
}
和xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:my="clr-namespace:WpfApplication1"
Title="MainWindow" Height="200" Width="300">
<Grid>
<Grid.Resources>
<my:ViewModel x:Key="viewM"/>
</Grid.Resources>
<ComboBox Height="23" HorizontalAlignment="Left" Margin="101,12,0,0" Name="comboBox1" VerticalAlignment="Top" Width="146"
ItemsSource="{Binding Source={x:Static my:ViewModel.Items}, Mode=OneWay}"
SelectedItem="{Binding Source={StaticResource viewM}, Path=SelectedItem}" />
</Grid>
</Window>
我上传了sample。
答案 1 :(得分:2)
您在实例和静态属性之间感到困惑:您不需要绑定静态对象。
<ComboBox
ItemsSource="{x:Static me:MainWindowViewModel.MyElements}"
SelectedItem="{x:Static me:MainWindowViewModel.SelectedElement}" />
然而,您应该实施INotifyPropertyChanged
。
绑定是关于解析要从中获取数据的正确实例。
如果没有实例的意义,则不需要绑定。