我有mvvmcross项目,一个带有Checked,TextOn和TextOff属性绑定的ToggleButton。我以编程方式设置文本,我在setter中看到调用了RaisePropertyChanged(),但是UI中的按钮文本保持不变,除非我点击它或更改绑定到“Checked”的属性的值。更改已检查似乎是一种解决方法,但很难看,是否有正确的方法?
FirstView.axml 包含
<切换按钮
机器人:ID = “@ + ID / myBtn”
local:MvxBind =“TextOff MyBtnOFFLabel; TextOn MyBtnONLabel; Checked MyBtnChecked”
机器人:textOff = “OFF”
机器人:纹理基元= “ON”
安卓:检查=“真”
机器人:layout_width = “WRAP_CONTENT”
机器人:layout_height = “FILL_PARENT”
机器人:layout_weight = “1”
android:width =“0dp”/>
FirstViewModel.cs 包含
private string myBtnOFFLabel;
public string MyBtnOFFLabel
{
get { return myBtnOFFLabel; }
set { myBtnOFFLabel = value; RaisePropertyChanged(() => MyBtnOFFLabel); }
}
private string myBtnONLabel;
public string MyBtnONLabel
{
get { return myBtnONLabel; }
set { myBtnONLabel = value; RaisePropertyChanged(() => MyBtnONLabel); }
}
public FirstViewModel()
{
Global.EventSomethingChanged += Handler_SomethingChanged;
}
void Handler_SomethingChanged(object sender, EventArgs e)
{
UpdateUI();
}
private void UpdateUI()
{
MyBtnOFFLabel = "new OFF";
MyBtnONLabel = "new ON";
}
SecondViewModel.cs 包含
Global.FireEventSomethingChanged();
如预期的那样,在FirstViewModel.cs中调用UpdateUI()并更新myBtn的标签属性(在调试模式下确认),但是当我在模拟器中关闭SecondViewModel时,我看到旧标签保留在第一个视图UI中。如果我点击该按钮,它会切换到显示正确的标签。
答案 0 :(得分:0)
我相信您需要在MyBtnChecked上使用RaisePropertyChanged。在上面的评论中,您提到将其添加到UpdateUI()会导致它正确地重绘。这不是"解决问题"因为你需要把它放在某个地方。你也可以这样做:
private string myBtnOFFLabel;
public string MyBtnOFFLabel
{
get { return myBtnOFFLabel; }
set {
myBtnOFFLabel = value;
RaisePropertyChanged(() => MyBtnOFFLabel);
RaisePropertyChanged(() => MyBtnChecked);
}
}
private string myBtnONLabel;
public string MyBtnONLabel
{
get { return myBtnONLabel; }
set {
myBtnONLabel = value;
RaisePropertyChanged(() => MyBtnONLabel);
RaisePropertyChanged(() => MyBtnChecked);
}
}
听起来你的MyBtnChecked依赖于对MyBtnOFFLabel和MyBtnONLabel的更改。否则你需要在其他地方触发这个RaisePropertyChanged。例如,我本来希望在MyBtnChecked的示例代码中看到一个可以执行此操作的属性。然后在您的视图模型中更改MyBtnChecked时,它将触发RaisePropertyChanged事件,以便在更改ViewModel bool属性时将其标记为已选中。