Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin 如果更改了TextOn或TextOff,则ToggleButton不会重新绘制_Xamarin_Mvvmcross - Fatal编程技术网

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

Xamarin 如果更改了TextOn或TextOff,则ToggleButton不会重新绘制,xamarin,mvvmcross,Xamarin,Mvvmcross,我有一个mvvmcross项目,一个带有Checked、TextOn和TextOff属性绑定的切换按钮。我以编程方式为这些设置文本,我在setter中看到调用了RaisePropertyChanged(),但UI中的按钮文本保持不变,除非我单击它或将属性值绑定为“Checked”。更改复选框似乎是一种解决办法,但很难看,有没有合适的方法 FirstView.axml包含 FirstViewModel.cs包含 private string myBtnOFFLabel; public strin

我有一个mvvmcross项目,一个带有Checked、TextOn和TextOff属性绑定的切换按钮。我以编程方式为这些设置文本,我在setter中看到调用了RaisePropertyChanged(),但UI中的按钮文本保持不变,除非我单击它或将属性值绑定为“Checked”。更改复选框似乎是一种解决办法,但很难看,有没有合适的方法

FirstView.axml包含

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";
}
Global.FireEventSomethingChanged();
SecondViewModel.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";
}
Global.FireEventSomethingChanged();

正如所料,UpdateUI()在FirstViewModel.cs中被调用,它会更新myBtn的标签属性(在调试模式下确认),但当我在emulator中关闭SecondViewModel时,我看到旧标签仍保留在first view UI中。如果我单击该按钮,它将切换到显示正确的标签。

我认为您需要在MyBtnched上提升属性更改。在上面的评论中,您提到将其添加到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的更改。否则,你需要在其他地方启动此RaiseProperty更改。。例如,我希望在MyBtnChecked的示例代码中看到一个属性,它可以实现这一点。然后,在视图模型中,当MyBtnChecked被更改时,它将触发RaisePropertyChanged事件,以在ViewModel bool属性被更改时将其标记为已检查或未检查。

一些代码、图片等将使您更容易理解您的要求。听起来像是组件中的错误,您应该向mvvmcross项目Hi Stuart提交一份错误报告,我添加了一些细节,我希望可以找到另一种解决方法:在UpdateUI()中,如果我调用RaisePropertyChanged(()=>MyBtnChecked);分配新标签后,UI将更新