Tom*_*yts 6 c# xaml winrt-xaml windows-phone-8.1 win-universal-app
在使用通用应用程序(目前仅在WP8.1方面)时,我偶然发现了以下奇怪的事情.
我有一个ComboBox,其中的UserControl(位于WindowsPhone项目中)绑定到共享项目中的VM.ItemsSource和SelectedItem都绑定到VM中各自的属性.
运行应用程序时,当您选择除第一个项目之外的任何项目时,它都可以正常运行.但是,当我选择第一个项目时,ComboBox中显示的字符串显示.ToString()了VM 的-method而不是......
(顺便说一句,这很简单List<string>,选中的项目是a string.它不能比那简单得多:p)
我创建了一个示例应用程序,其中只包含此Combobox和VM.我能够重现这一点,我异步填写绑定到ItemsSource的属性的那一刻.从同步方法执行时,它可以工作.但是从异步方法填充它只会产生上述问题.
一些截图:
第一个显示应用程序何时加载.集合更改时,将选择列表的第一个元素.它显示在这里:

当您单击ComboBox时,您可以像往常一样查看其项目:

假设你点击第一个以外的任何元素,你仍然会得到正常的行为:

到目前为止,这是正常的.现在单击第一个项目.你得到这个:

...
我尝试了各种各样的事情,比如把它作为一个对象的列表,而不仅仅是字符串.将转换器添加到绑定对象,仅用于调试目的,仅显示实际的字符串值.我不知道绑定的SelectedItem如何以及为什么突然显示ComboBox的DataContext ...
你可以在这里下载示例应用程序:http: //1drv.ms/1DhklCQ (不包含二进制文件,只包含代码)
有人有任何想法吗?
编辑:重现此问题所需的代码:
创建一个空白的通用商店应用程序(8.1).在WindowsPhone项目中,文件MainPage.xaml:我添加了一个简单的组合框,并捕获Loaded事件.
<ComboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />
Run Code Online (Sandbox Code Playgroud)
在它的代码背后.我已将DataContext分配给VM.在Loaded事件中,我异步调用VM.LoadData()
private VM _vm = new VM();
public MainPage()
{
this.InitializeComponent();
this.DataContext = _vm;
}
private async void Page_Loaded(object sender, RoutedEventArgs e)
{
await _vm.LoadDataAsync();
}
Run Code Online (Sandbox Code Playgroud)
VM对象定义如下:
public class VM : INotifyPropertyChanged
{
private List<string> _items;
public List<string> Items
{
get { return _items; }
set
{
_items = value;
_selectedItem = _items.FirstOrDefault();
RaisePropertyChanged("Items");
RaisePropertyChanged("SelectedItem");
}
}
private string _selectedItem;
public string SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
RaisePropertyChanged("SelectedItem");
}
}
public VM()
{
}
public async Task LoadDataAsync()
{
this.Items = new List<string>()
{
"a",
"b",
"c",
"d",
"e",
"f",
};
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
找到一个解决方法原因以前的解决方案没有解决我的问题.
只需在绑定和选择组合框的项目或索引之间添加一个暂停.
代码如下:
myCombobox.ItemsSource = myList;
await Task.Delay(100);
myCombobox.SelectedIndex = 12;
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 !
不仅是异步 - 如果您放入_vm.Items = new List...OnLoaded事件,而不是await _vm.LoadDataAsync();- 你会遇到同样的问题。
一旦你设置了你的项目,似乎就不会出现这个问题在设置 DataContext 之前
另一件事是,如果您不从代码中设置所选项目,则不会出现该问题(正如我所尝试的那样):
public ObservableCollection<string> Items
{
get { return _items; }
set
{
_items = value;
// _selectedItem = _items.FirstOrDefault();
RaisePropertyChanged("Items");
// RaisePropertyChanged("SelectedItem");
}
}
Run Code Online (Sandbox Code Playgroud)
至于现在我不知道为什么会发生这种情况。
| 归档时间: |
|
| 查看次数: |
3206 次 |
| 最近记录: |