【问题标题】:UI does not get updated after updating property in DelegateCommand method在 DelegateCommand 方法中更新属性后 UI 未更新
【发布时间】: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# 代码。尴尬。

标签: c# wpf mvvm


【解决方案1】:

ViewModel 必须实现 INotifyPropertyChanged。就这么简单。该死,我为此浪费了一个下午。

【讨论】:

    猜你喜欢
    • 2017-06-25
    • 2019-07-28
    • 2021-08-02
    • 2017-04-28
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多