我有我想做的独特行为。
我有一个组合框,可以数据绑定到viewmodel项列表。第一项是“[选择项目]”。预期的行为是,当用户选择一个项目时,我会做一些事情,然后将索引重置回第一个项目。
这是有效的,除了如果你想连续2次选择第3项。这是代码: ItemViewModel:
// NOTE, I have all the INotify goo actually implemented, this is the shorthand
// without goo to make it more readable.
public class ItemViewModel : INotifyPropertyChanged
{
public string Caption { get; set; }
public string Test { get; set; }
}
ViewModel :(我的所有属性都在适当的位置调用OnPropertyChanged)
public class ViewModel : INotifyPropertyChanged
{
public ObservableCollection<ItemViewModel> ChildItems { get; set; }
public int SelectedChildIndex { get; set; }
public string DebugOutText { get; set; }
public ViewModel()
{
ChildItems = new ObservableCollection<ItemViewModel>();
SelectedChildIndex = -1;
DebugOutText = string.Empty;
}
public void LoadChildItems()
{
ChildItems.Add(new ItemViewModel { Caption = "[ Select Item ]" });
ChildItems.Add(new ItemViewModel { Caption = "One", Test = "Item 1" });
ChildItems.Add(new ItemViewModel { Caption = "Two", Test = "Item 2" });
ChildItems.Add(new ItemViewModel { Caption = "Three", Test = "Item 3" });
SelectedChildIndex = 0;
}
private void OnPropertyChanged(string propName)
{
if (propName == "SelectedChildIndex") { this.OnSelectedChildIndexChanged(); }
if (this.PropertyChanged != null)
{ this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); }
}
public void OnSelectedChildIndexChanged()
{
if (SelectedChildIndex <= 0) return;
DebugOutText += "\r\n" + ChildItems[SelectedChildIndex].Test;
SelectedChildIndex = 0; // <- BIG ISSUE HERE
}
}
现在我的xaml:
<StackPanel HorizontalAlignment="Left">
<ComboBox Width="200" x:Name="combo"
ItemsSource="{Binding Path=ChildItems}"
SelectedIndex="{Binding Path=SelectedChildIndex, Mode=TwoWay}"
DisplayMemberPath="Caption" />
<TextBlock Text="{Binding Path=DebugOutText}"/>
</StackPanel>
最后我的App Startup:
var vm = new ViewModel();
vm.LoadChildItems();
this.RootVisual = new MainPage { DataContext = vm };
回购步骤是:
我已经去了一些跟踪代码,组合的SelectedIndex是0,ViewModel.SelectedChildIndex是0,但是组合的SelectionChanged不会触发,除非我选择别的东西。
我不确定如何让它发挥作用。任何帮助将不胜感激。
答案 0 :(得分:1)
我不得不承认我对你想要的行为的可用性表示怀疑。尽管如此,如果您必须为此目的使用组合框,请尝试替换
行 SelectedChildIndex = 0;
与
Deployment.Current.Dispatcher.BeginInvoke(() => SelectedChildIndex = 0);
答案 1 :(得分:0)
在这里疯狂猜测。 :)
// NOTE, I have all the INotify goo actually implemented, this is the shorthand
// without goo to make it more readable.
您没有显示INotifyPropertyChanged的实现。大多数实现都是这样的:
public int SelectedChildIndex
{
get
{
return _selectedChildIndex;
}
set
{
if (value == _selectedChildIndex) return;
_selectedChildIndex= value;
OnProperyChanged("SelectedChildIndex ");
}
}
如果属性值没有改变,则会将通知短路。如果您的代码如下所示,请取出“if”语句并查看是否可以修复它。