UserControl和主窗口之间的绑定问题

本文关键字:绑定 问题 之间 窗口 UserControl | 更新日期: 2023-09-27 18:17:06

我在这个绑定中缺少一些东西,因为它不起作用。这是为了学习的目的,如果你看到如何可以改进,请告诉我。但除此之外,我也很想知道为什么这不起作用。

在我的MainWindow中有一个CheckBox,它绑定了一个命令:checkCommand

在<<p> strong> RootViewModel.cs :
 public Command checkCommand { get; set; }

 public RootViewModel()
        {
 checkCommand = new Command(mark);
        }
private void mark()
        {          
            myThingsCollection[0].marked= true;               
        }

该命令工作正常,并且它还将marked的状态更改为true(我已经用MessageShowBox进行了测试)。

我之前已经将UC添加到ObsevableCollection<UC> (myThingsCollection)并以这种方式在MainWindow.cs

中将其绑定到ItemsControl
<ItemsControl ItemsSource="{Binding myThingsCollection}">
                        <DataTemplate> <!--I've ommited some parts here--!>
                           <local:UC/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>

UC显示正常。

markedUCViewModel的一个属性:

class UCViewModel
    {
        #region Implementation of INotifyPropertyChanged

        private bool _marked;
        public bool marked
        {
            get
            {
                return _marked;
            }
            set
            {
                _marked= value;
                OnPropertyChanged("marked");
            }
        }
    }

UserControl (UC)有一个CheckBox,我这样绑定:

 <CheckBox Content="Hello!" IsChecked="{Binding marked}"/>

并这样设置DataContext(在UC.cs.xaml后面的代码中)

        public UC()
    {
        UCViewModel context = new UCViewModel();
        DataContext = context;
        InitializeComponent();
    }

但是它不起作用。我不知道它少了什么。顺便说一下,我很确定这不是解决这个问题的好方法,有更简单的方法吗?由于

UserControl和主窗口之间的绑定问题

下载链接:Here

^^ Link应该有一个项目,你所做的一切都很好。

如果你想从你的代码中寻找改进的建议,一些指针:

  • 用特定的样式指南命名变量。属性以"Uppercase"开头。StyleCop可以帮助识别问题。是的,样式指南非常重要:)
  • 与MVVM,你的MyThingsCollection不应该是UserControl的集合,但他们应该是他们的VM的集合
  • 不要在视图后面的代码中创建VM(除非你确定你在做什么)。这不仅会重置你的VM,而且还会经常创建视图,这可能不是理想的,特别是在MVVM中。
  • 在使用MVVM时使用MVVM辅助库,即使你想自己做事情。学习系统,然后自己去做,而不是马上走漫长的道路。
  • 不保持查看虚拟机中相关元素。这破坏了MVVM。千万别这么做。即使您认为没有其他选择,也有很多方法可以避免这样做。只需搜索em

如果你确定你的视图模型实现,那么试着改变你的绑定语法。

    IsChecked="{Binding path=marked, Mode=TwoWay}"