我已经在树莓派上运行了我的第一个单声道应用程序。问题是数据绑定没有更新UI。更具体地说,我的控制器/模型中的PropertyChanged事件是null。这意味着没有订户。
当我在visual studio调试器内的Windows上运行应用程序时,ui会得到适当的更新。
单声道版本:4.6.2 操作系统:Raspbian Wheezy .NET:4.5
我发现这方面的信息不多。由于它适用于Windows和单声道支持INotifyPropertyChanged接口,我认为它也将在Linux上以单声道运行。
// creating the binding in code
dhtControl.labelName.DataBindings.Add("Text", dht, "Name");
我认为不需要其他代码,因为它是默认的INotifyPropertyChanged实现。唯一的区别是我将一个Action(control.Invoke)传递给模型以在主线程上调用更新。
此致
答案 0 :(得分:0)
我有同样的问题,解决了添加ViewModel触发的动作事件,其中更新了所有控件:
internal void InvokeUIControl(Action action)
{
// Call the provided action on the UI Thread using Control.Invoke() does not work in MONO
//this.Invoke(action);
// do it manually
this.lblTemp.Invoke(new Action(() => this.lblTemp.Text = ((MainViewModel)(((Delegate)(action)).Target)).Temperature));
this.lblTime.Invoke(new Action(() => this.lblTime.Text = ((MainViewModel)(((Delegate)(action)).Target)).Clock));
}
答案 1 :(得分:0)
我注意到.NET和Mono之间存在差异,我遇到了同样的问题。在比较.NET和Mono源代码之后,首先看来,如果您希望在ViewForm中收到任何Control.TextChanged中的propertyName通知,您首先必须在您的模型中:
public event PropertyChangedEventHandler PropertyChanged;
public event EventHandler TextChanged;
protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
if (propertyName == "Text")
{
TextChanged?.Invoke(this, EventArgs.Empty);
}
}
}
将事件处理程序命名为“TextChanged”以通知TextChanged非常重要。 然后仍然在您的模型中,您可以设置:
private string _Text = "";
public string Text {
get {
return _Text;
}
set {
if (_Text != value) {
NotifyPropertyChanged ("Text");
}
}
}
现在,在你看来,你可以做这样的事情。
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace EventStringTest
{
public partial class Form1 : Form
{
Model md = Model.Instance;
public Form1()
{
InitializeComponent();
textBox1.DataBindings.Add("Text", md, "Text", false
, DataSourceUpdateMode.OnPropertyChanged);
this.OnBindingContextChanged(EventArgs.Empty);
textBox1.TextChanged += (object sender, System.EventArgs e) => { };
}
private void Form1_Load(object sender, EventArgs evt)
{
md.PropertyChanged += (object s, PropertyChangedEventArgs e) => { };
// This is just to start make Text Changed in Model.
md.TimerGO ();
}
}
}
这似乎是很多代码,但我仍然在寻找一个更优雅的解决方案。