WPF Combox数据已更新,但UI未更新 - 更新了代码

时间:2017-07-28 16:36:06

标签: c# wpf user-interface

以下是代码:

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未更新。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

有关详细信息,请参阅here

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