我遇到了同樣的問題,不是ToggleButton
,而是TextBox
,我想要格式化用戶輸入的文本。
在你的情況下,你想改變你的viewmodel中的IsChecked
屬性,並立即反映在用戶界面中(所以總是被取消選中)。你想要的原因絕對不重要。
問題是,如果您點擊ToggleButton
,UWP會調用您的屬性的獲取方法,就像您期望的那樣。 ToggleButton
的正常操作是從未檢查變爲檢查(反之亦然),這就是你的情況。但是,你期望NotifyPropetyChanged
表示UI中的控件。這就是它出錯的地方。當setter執行時(包括NotifyPropertyChanged
),getter不會被調用,所以UI並不反映你在setter中做了什麼。 這與TwoWay Binding用來做什麼(並且仍然在WPF中)完全不同。所以你的代碼沒有問題,但似乎綁定機制已經改變了,儘管微軟聲稱它沒有改變。如果你使用x:Bind
,它可以正常工作,所以帽子可以解決你的問題。
爲了更清楚地說明一些事情,我已將您的示例稍作修改,以顯示問題。 我已經把頁面上的一個ToggleButton
與TwoWay綁定到視圖模型,完全一樣。點擊ToggleButton
會將其狀態從已選中狀態切換爲未選中狀態,反之亦然,即使我的viewmodel中的setter始終將該屬性設置爲false(因此未選中)。 但我還添加了一個普通按鈕,我已經綁定到一個命令,該命令還修改了ToggleButton
綁定的屬性。點擊此按鈕將調用ToggleButton
所綁定的屬性上的setter。當然,setter被調用的方式是一樣的,但在此之後綁定到ToggleButton
被調用,因此在這種情況下NotifyPropertyChanged
確實會導致UI更新。
如果你使用調試器,你可以看到我的意思。 所以你的問題可以通過使用x:Bind來解決,或者通過另一種方法來更新UI,如果Binding仍然像以前一樣工作,你不應該這麼做。也許微軟已經實施了一些現在破壞了經典綁定的優化。
沒有特別的事情,只是一個MainPage和一個視圖模型。
我對MainPage.xaml中
<Page x:Class="App10.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:App10"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<local:ViewModel x:Key="viewModel" />
</Page.Resources>
<Grid x:Name="mainGrid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel Margin="10,20,10,0">
<Button
x:Name="Button"
Content="UWP Normal button"
Command="{Binding Source={StaticResource viewModel}, Path=SwitchIschecked}"
HorizontalAlignment="Stretch" />
<ToggleButton
x:Name="toggleButton"
Margin="0,10,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
IsChecked="{Binding Source={StaticResource viewModel}, Path=IsChecked,
Mode=TwoWay}">
<TextBlock>UWP Toggle Button</TextBlock>
</ToggleButton>
</StackPanel>
</Grid>
</Page>
代碼爲MainPage.xaml.cs中
using Windows.UI.Xaml.Controls;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace App10
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
}
}
而對於ViewModel.cs
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;
namespace App10
{
public class ViewModel : INotifyPropertyChanged
{
private bool _isChecked;
// property for TwoWay binding with ToggleButton
public bool IsChecked
{
get
{
return _isChecked;
}
set
{
// extra var just to check 'value'
var _value = value;
// now always set it to false
_isChecked = false;
// Try to pass value of _isChecked to user interface
// because there is no check whether the value really
// has changed
// But this only works if the setter is not being called
// directly from the control the property is bound to
OnPropertyChanged();
}
}
private ICommand _switchChecked;
// ICommand for normal button, binding to Command
// calls method to set Property for ToggleButton
public ICommand SwitchIschecked
{
get
{
if (_switchChecked == null)
_switchChecked = new ChangeChecked(new Action(ChangeVar));
return _switchChecked;
}
set
{
_switchChecked = value;
}
}
// This will set the property for the ToggleButton
private void ChangeVar()
{
IsChecked = !IsChecked;
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
/// <summary>
/// Quick class to implement ICommand
/// </summary>
class ChangeChecked : ICommand
{
Action _execute;
public ChangeChecked(Action execute)
{
_execute = execute;
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_execute();
}
}
}
來源
2016-07-29 23:57:05
P59
嘗試使代碼'類模型視圖代碼'public class – thumbmunkeys
使'class ModelView'成爲一個公共類仍然沒有正確綁定。:/ ToggleButton仍然會轉爲「已選中」。 – user3863376
你的'set'正在做'_isEnabled = false;'...... – jsanalytics