【发布时间】:2012-07-13 10:15:38
【问题描述】:
-------编辑------
所以,我认为我的代码是正确的,你所有答案中的代码 sn-ps 也是正确的。感谢那。我的问题是我的开发机器运行的 .NET4.5 行为不同!相同的程序(针对 .NET4.0 编译)在 .NET4.0 的机器上运行正确,但在 .NET4.5 的机器上运行不正确!
这是我修改后的question。
-------编辑------
首先,我如何将组合框双向绑定到数据上下文的简单示例:
查看模型:
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";
}
}
我不再需要在代码隐藏中设置数据上下文,而且我知道,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...也没有任何变化。
【问题讨论】:
-
再次检查您的代码后,我不得不说它对我有用。我已修改
public static string SelectedElement以在调用setter 时写入跟踪输出,并且每次所选项目更改时都会调用它。您仍然可以按照@Baboon 的建议将ItemsSource绑定替换为静态引用。 -
呃,我已经安装了 .NET4.5。有没有可能这里变了?当然,我的财产中也有踪迹。为简单起见,这里省略了它。是的,我知道我通常也会实现 INotifyPropertyChanged 以将更改从属性绑定到 ComboBox。
标签: wpf xaml data-binding combobox two-way-binding