【问题标题】:Pass the value from View to the Mainwindow when the View is closed当视图关闭时,将值从视图传递到主窗口
【发布时间】:2017-08-17 05:49:59
【问题描述】:

我制作了一个基于 MVVM 的用户控件。一个窗口(例如 MainWindow.xaml)调用这个用户控件,这个用户控件的视图有一个带有节点、子节点和按钮(“确定”等)的树视图。用户在树形视图中选择一个节点并按下视图上的“确定”按钮。我可以在 View.xaml.cs 中读取树视图的选定节点。我在 View.xaml.cs 中创建了依赖属性来保存选定的树视图项。在 mainwindow.xaml.cs 中,我正在实例化我的用户控件并调用依赖属性,例如usercontrol.value 其中 value 是视图中的依赖属性。 总体思路是当用户选择树视图节点并按确定时,视图应该关闭,并且所选树视图项的值被paased到窗口。

问题是当我关闭视图时,依赖属性的值丢失并且 null 返回到窗口

我是 WPF 新手。

Window.xaml

<Grid>
    <view:SystemExplorerView x:Name="MyView"></view:SystemExplorerView>
</Grid>

Window.xaml.cs

 public object m_myValue;
    public object myValue {
        get { return m_myValue; }
        set
        {
            m_myValue = value;
            OnPropertyChanged("myValue");
        }
    }
public Window1()
        {
            InitializeComponent();
            myValue = MyView.Value;
        }

View.xaml.cs

    public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(object), typeof(SystemExplorerView),
                new PropertyMetadata(null));
  public SystemExplorerView()
        {
            InitializeComponent();
        }
public object Value
        {
            get { return (object)GetValue(ValueProperty); }
            set
            {
                SetValue(ValueProperty, value);

            }
        }
 private void OKbtnclk(object sender, RoutedEventArgs e)
        {
            Value = myTreeView.SelectedItem;
            Window.GetWindow(this).Close();
        }

【问题讨论】:

  • 代码很大,我已经发布了一些,如果您需要更多信息,请告诉我。
  • 由于您的 UserControl “基于 MVVM”,因此您不需要使用依赖属性。将数据存储在 ViewModel 中并使用它进行操作!
  • 如果我存储在 ViewModel 中,那么我将如何将属性从 ViewModel 传递到 MainWindow,这不违反 MVVM 规则吗?我还在学习这些东西
  • 查看 C# MVVM 总结和完整示例stackoverflow.com/documentation/mvvm/4293/…
  • @Smallestearth 不要听 StackOverflow 上的所有建议。依赖属性正是 UserControls 的正确方法。 UserControl 通常不应该有任何“自己的”视图模型。而是在实例化控件时将其依赖属性绑定到视图模型属性。

标签: c# wpf xaml mvvm treeview


【解决方案1】:

您可以在Closing 事件处理程序中访问该属性:

<Window ... Closing="Window_Closing">
    ...
</Window>

后面的代码:

private void Window_Closing(object sender, CancelEventArgs e)
{
    myValue = MyView.Value;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多