gpt4 book ai didi

wpf - ComboBox 到静态属性的双向绑定(bind)

转载 作者:行者123 更新时间:2023-12-01 23:08:05 27 4
gpt4 key购买 nike

--------编辑------

因此,我认为我的代码是正确的,您所有答案中的代码片段也是如此。感谢那。我的问题是我的开发机运行 .NET4.5,它的行为不同!完全相同的程序(针对 .NET4.0 编译)在使用 .NET4.0 的机器上运行正确,但在使用 .NET4.5 的机器上运行不正确!

这是我修改后的 question .

--------编辑------

首先,我是如何将我的组合框双向绑定(bind)到我的数据上下文的简单示例:

查看模型:

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}" />

这很好用,如果我用组合框选择一个项目,它就会绑定(bind)到我的 View 模型。

好的,现在我想让我的 viewModel 静态化,但仍然双向绑定(bind) 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 需要一个用于双向绑定(bind)的实例,所以我仍然有默认构造函数。然后我绑定(bind)组合框

<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>

初始值已正确绑定(bind),但如果我使用组合框选择另一个项目,它不会反射(reflect)在我的 viewModel 中。我做错了什么?

编辑:

如果我对 TextBox 使用完全相同的绑定(bind)字符串并更改框中的文本,它会反射(reflect)在属性中。

<TextBox Text="{Binding Source={StaticResource model}, Path=SelectedElement}"/>

显然我的绑定(bind)字符串是正确的,但我使用组合框的方式似乎是错误的。我也尝试绑定(bind) SelectedValue ......也没有改变。

最佳答案

只检查了一个示例项目,工作正常

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 .

关于wpf - ComboBox 到静态属性的双向绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11468502/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com