【问题标题】:Binding between UserControl and MainWindow issueUserControl 和 MainWindow 之间的绑定问题
【发布时间】:2013-06-02 04:52:19
【问题描述】:

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

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

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();

    }

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

【问题讨论】:

  • -.- [...] 但它不起作用。 [...] - 非常有用,就像“我的应用程序崩溃了”。来吧,你必须提供更多的细节。您是否在 VS 的调试输出窗口中收到任何 BindingExpression 错误?顺便说一句,Command 这是一个自定义类吗?
  • 是的,Command 是启用命令的自定义类。我看不到 BindingExpression 错误。我再检查一下。
  • 我已在设置、输出窗口中将 DataBinding Trace 设置为“全部”。但我找不到显示错误的位置。它们是否显示在与正常错误相同的位置?如果是这样,则没有任何错误。
  • 不,如果您指的是正常错误输出窗口,则它们不是,其中显示了编译错误。调试 > 窗口 > 输出

标签: c# wpf binding command viewmodel


【解决方案1】:

如果您确定您的视图模型实现,请尝试更改您的绑定语法。

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

【讨论】:

    【解决方案2】:

    下载链接:Here

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

    如果您正在寻找改进代码的建议,请提供一些建议:

    • 使用特定的样式指南命名您的变量。属性以“大写”开头。 StyleCop 可以帮助识别问题。是的,风格指南非常重要:)
    • 使用 MVVM,您的 MyThingsCollection 不应是 UserControl 的集合,但它们应该是其 VM 的集合
    • 不要在 View 的代码隐藏中创建 VM(除非您确定自己在做什么)。这不仅会重置您的虚拟机,而且还会经常创建视图,这可能是不可取的,尤其是在 MVVM 中。
    • 从 MVVM 开始时使用 MVVM 帮助程序库,即使您想自己做一些事情。学习系统,然后自己动手,而不是一头扎进漫长的道路。
    • 不要在 VM 中保留 View 相关的元素。这打破了 MVVM。只是不要这样做。即使您认为没有其他选择,也有 的方法可以避免这样做。只需搜索他们

    【讨论】:

    • 我这里写错了,其实是VM的集合。感谢您的建议。当我在 MVVM Light 中创建项目时,有一堆我(认为)不需要的东西,这让我很不安。
    • @Sturm 很好,如果您不需要某些东西,请摆脱它。或者创建一个标准的 WPF 应用程序并将 MVVMLight dll 添加为引用并从那里构建它。 ViewModelBaseObservableObjectRelayCommandSimpleIOC 之类的东西非常值得在启动 IMO 时使用而无需修改
    • “我(认为)不需要,这让我很不安” - 你不理解的东西(你自己说过)怎么会打扰你?它们应该是您想要立即查看并查看它们所做的事情,如果您认为它们毫无意义,您可以相应地重构它们。警惕任何你不理解的东西不会教给你很多东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2013-04-12
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多