twoWay 绑定在以 ObservableCollection 作为源的 ToggleButton 中不起作用

Posted

技术标签:

【中文标题】twoWay 绑定在以 ObservableCollection 作为源的 ToggleButton 中不起作用【英文标题】:twoWay binding is not working in ToggleButton with ObservableCollection as the source 【发布时间】:2021-05-08 15:32:00 【问题描述】:

我成功地将两个ToggleButton 绑定到一个ObservableCollection<VMData>,按钮的IsChecked 状态是我遇到问题的地方:

XAML:

<ToggleButton Content="One" x:Name="ToggleButtonOne" Margin="10,20,0,0" Width="100"
          Command="Binding ToggleButtonClicked_Command"
          CommandParameter="Binding ElementName=ToggleButtonOne"
          IsChecked="Binding VMDataInfoSet[0].Running, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay"/>

<ToggleButton Content="Two" x:Name="ToggleButtonTwo" Margin="10,10,0,0" Width="100"
          Command="Binding ToggleButtonClicked_Command"
          CommandParameter="Binding ElementName=ToggleButtonTwo"
          IsChecked="Binding VMDataInfoSet[1].Running, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay"/>

在 ViewModel 中:

public ObservableCollection<VMData> VMDataInfoSet  get; set; 

public class VMData

    public string MyType  get; set; 
    public string ID  get; set; 
    public double Qty  get; set; 
    public string Action  get; set; 
    public bool Running  get; set; 

单击ToggleButton 时,VMDataInfoSet[0].Running 成功从false 状态更新为true。然而,当我通过视图模型中的一个简单方法将VMDataInfoSet[0].Running 设置为false(当ToggleButton 被选中时,又名true)时,ToggleButton 仍然是“蓝色”并且不会更新回未选中状态状态。所以我可以通过按钮更新ObservableCollection,但我不能通过ObservableCollection/code 更新按钮。

关于 SO 有很多类似的问题,尤其是对于 WPF。虽然我还不能弄清楚这一点。切换按钮here 的OneWay 绑定存在问题。我已经尝试添加UpdateSourceTrigger,如我的示例here。

有什么想法吗?

【问题讨论】:

您需要在您的 VMData 类上实现接口 INotifyPropertyChanged。 【参考方案1】:

正如@JohnnyQ 在 cmets 中提到的,在 VMDataClass 中实现 INPC 接口:

public class VMData : INotifyPropertyChanged

    private string myType;
    private string iD;
etc

    public string MyType
    
        get  return myType; 
        set
        
            myType = value;
            RaisePropertyChanged("MyType");
        
    
    public string ID
    
        
            iD = value;
            RaisePropertyChanged("ID");
        
    
etc

    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged(string name)
    
        if (PropertyChanged != null)
        
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        
    

【讨论】:

以上是关于twoWay 绑定在以 ObservableCollection 作为源的 ToggleButton 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

InvalidOperationException - TwoWay 或 OneWayToSource 绑定无法在只读属性上工作

InvalidOperationException - TwoWay 或 OneWayToSource 绑定无法在只读属性上工作

Silverlight Treeview SelectedItem TwoWay 绑定导致混合错误

WPF CheckBox TwoWay 绑定不起作用

TwoWay 模式的绑定和 x:Bind 问题

如何使用 TwoWay 模式将 Listview SelectedItem 绑定到文本框?