【发布时间】:2016-03-07 14:13:48
【问题描述】:
我有一个窗口(从主窗口 ViewModel 打开),其中包含一个 ListView 和一个按钮。此 ListView 的内容绑定到 ObservableCollection。
<ListView ItemsSource="{Binding FoundElements}" Grid.Row="2" />
按钮触发命令
<Button Command="{Binding SearchCommand}" Margin="10 0 0 0">
<Button.Content>
<TextBlock Text="Search" VerticalAlignment="Center" />
</Button.Content>
</Button>
在 ViewModel 中,我绑定了 DelegateCommand 和属性。
private ObservableCollection<String> _foundElements;
public ObservableCollection<string> FoundElements
{
get { return _foundElements; }
set { _foundElements= value; OnPropertyChanged("FoundElements"); }
}
ICommand _searchCommand;
public ICommand SearchCommand
{
get { return _searchCommand; }
set { _searchCommand = value; }
}
在构造函数中:
this.SearchCommand = new DelegateCommand(o => SearchMethod());
如果我在构造函数中修改属性,窗口会显示修改后的属性(即列表中有元素)但如果我在 DelegateCommand 方法中修改属性,按下按钮后,它不会(我检查并输入方法)。
this.FoundElements = new ObservableCollection<String>() { "a", "a", "a", "a", "a", "a", "a", "a" };
在主窗口ViewModel中创建窗口
SubWindow w = new SubWindow();
w.Owner = System.Windows.Application.Current.MainWindow;
w.Show();
并在子窗口代码隐藏中分配 DataContext
public SubWindow()
{
this.DataContext = new SubWindowViewModel();
InitializeComponent();
}
这是 OnPropertyChanged:
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
切换 DataContext 分配和 InitialiseComponent() 我在控制台中收到此错误:
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=FoundElements; DataItem=null; target element is 'ListView' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')
在 Dispatcher 中创建窗口/更新属性,例如:
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
// code
}));
没有任何作用。
有什么想法吗?
谢谢。
【问题讨论】:
-
看起来应该可以了。 INPC 显然由于某种原因无法正常工作。 . OnPropertyChanged() 是什么样的?
-
谢谢你的回答,我修改了问题。
-
您能展示一下您的委托命令调用的
SearchMethod()函数吗? -
它不应该是TwoWay,但我试过了,没有改变......
-
好吧,我是个混蛋:忘记让 ViewModel 实现 INotifyPropertyChanged -.- 有一段时间我没有接触 C# 代码。尴尬。