如果更改了TextOn或TextOff,则不会重绘ToggleButton

时间:2014-11-28 04:32:13

标签: xamarin mvvmcross

我有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中。如果我点击该按钮,它会切换到显示正确的标签。

1 个答案:

答案 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属性时将其标记为已选中。