【问题标题】:WPF Combox data updated but UI not updated - Updated codeWPF Combobox 数据已更新但 UI 未更新 - 已更新代码
【发布时间】:2018-01-04 19:36:40
【问题描述】:

代码如下:

MainWindow.xaml

<ComboBox Grid.Column="1" Margin="2" VerticalContentAlignment="Center" ItemsSource="{Binding Path=LowDLane, Mode=OneWay}"
                                  SelectedIndex="{Binding Path=CurrentLowDLaneIndex, Mode=TwoWay, FallbackValue=0}"
                                  DropDownOpened="onLowDLaneDropDownOpened"
                                  SelectionChanged="onLowDLaneChanged">
</ComboBox>

MainWindow.xaml.cs

public partial class MainWindow : Window
{

    public MainWindow(ViewModel model)
    {
        InitializeComponent();
        this.DataContext = model;
    }

    private void onLowDLaneDropDownOpened(object aSender, EventArgs aE)
    {
        ((ViewModel)this.DataContext).openedDropDown();
    }
}

ViewModel.cs 更新

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChangedHandler;

    public List<string> LowDLane
    {
        get { return mLowDLane; }
        set
        {
            mLowDLane = value;
           PropertyChangedHandler.raise(this, ()=> LowDLane);
        }
    }
    public void openedDropDown()
    {
        LowDLane = new List<string> { "1", "2", "3", "4", "5", "6", "7", "8"};
    }

}

在其他文件中定义了 PropertyChangedEventHandler:

namespace System.ComponentModel

{

public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);

}

表示将处理 System.ComponentModel.INotifyPropertyChanged.PropertyChanged 的​​方法 更改组件上的属性时引发的事件。

PropertyChangedEventHandler 在其他地方运行良好,所以我认为这不是这里的问题。

我在其他文件中创建了ViewModel 对象,并将其传递给MainWindow。 当我运行应用程序时,我可以看到 LowDLane 属性已更新,但 UI 未更新。

我看过很多类似的问题,但没有一个能解决我的问题。 有人可以帮忙吗?

【问题讨论】:

  • 您发布的代码无法编译。您声称在LowDLane 属性设置器中调用ViewModel.PropertyChanged 事件委托,但这样做需要两个参数。有人可能会发布一个答案,告诉您在那里打电话给NotifyPropertyChanged(),但是由于您发布的代码无法编译,很明显您一开始没有发布真正的代码,因此做出任何假设都是毫无意义的代码以任何方式表示您的实际代码是什么样的。修正您的问题,使其包含一个实际的、良好的minimal reproducible example,该minimal reproducible example 可以可靠地重现问题。

标签: c# wpf user-interface


【解决方案1】:

你应该在你的 setter 中调用你的 NotifyPropertychanged 方法

public List<string> LowDLane
{
      get { return mLowDLane; }
      set
      {
         mLowDLane = value;
         NotifyPropertyChanged("LowDLane"); // here
      }
}

更多详情见here

您可能想在代码中使用CallerMemberName 属性,请参阅here

【讨论】:

    【解决方案2】:

    UpdateSourceTrigger 属性添加到组合框 itemSource 绑定,并将 Mode 设置为 TwoWay。

    ItemsSource="{Binding Path=LowDLane, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    

    如果这能解决问题,请告诉我。

    【讨论】:

    • 我不知何故错过了“PropertyChanged”事件的实现部分以及它是如何被调用的,并继续检查与 UI 的绑定。
    • 我已尝试将 Mode 设置为 TwoWay 并设置 UpdateSourceTrigger,但仍然无法解决我的问题。
    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多