gpt4 book ai didi

c# - 在 MainWindows 和 UserControl 之间共享 DataContext

转载 作者:行者123 更新时间:2023-11-30 20:34:57 24 4
gpt4 key购买 nike

我想知道是否可以在 Windows 和 C#/WPF 中的 UserControl 之间共享数据上下文。

我有一个这样的主窗口(未完成):

主窗口.xaml:

<Window x:Class="MyProject.MainWindow"
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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyProject"
xmlns:v="clr-namespace:MyProject.Views"
mc:Ignorable="d"
Title="MyProject" >
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<v:GenerateView/>
<v:ReadView/>
</Grid>
</Window>

MainViewModel.cs:

public class MainViewModel : ViewModelBase
{
#region Properties
#endregion

#region Fields
#endregion

#region Constructor
public MainViewModel()
: base()
{
}
#endregion

#region Methods
#endregion

#region Commands
#endregion
}

根据 future 的参数,我将显示我的 View GenerateView 或 ReadView。实际上我正在开发 UserControl GenerateView,但我想知道我是否可以使用相同的 Datacontext。

根据 that post , 我是这样开始的:

<UserControl x:Class="MyProject.Views.GenerateView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MyProject.Views"
xmlns:p="clr-namespace:MyProject.Properties"
xmlns:MyProject="clr-namespace:MyProject"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyProject:MainWindow}}}">
<Grid>
</Grid>
</UserControl>

但是它不起作用,当我尝试访问 GenerateView 中的 Datacontext 时,它是空的。

编辑:

我忘记了一部分代码:

public partial class GenerateView : UserControl
{
private MainViewModel Context
{
get
{
return DataContext as MainViewModel;
}
}

public GenerateView()
{
InitializeComponent();
Context.PropertyChanged += Context_PropertyChanged;
}

private void Context_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
//Action to perform
}
}

Context.PropertyChanged += Context_PropertyChanged; 行抛出异常,因为 Datacontext 为空。

最佳答案

为 Window 及其子用户控件重用 View 模型背后的主要要求是什么?这没有意义。两者都有共同点吗?

在我看来,创建一个 MainWindowViewModel 并创建一个 SubViewModel 用于用户控制。在您的 MainWindowViewModel 中创建 subview 模型的实例并使用 DataContext.SubViewModel 访问它们。

通过这样做,您可以很好地维护代码和应用程​​序,并保持编码标准并拥有一个没有复杂性的 View 模型。如果您只是为了可重用性而混淆所有内容,您可能会违反 MVVM 模式。让不同的 View /窗口拥有自己的 View 模型,因为它们完全不同。

如果两者相似,那么您可以使用 Dependency Properties 创建可重用的控件。

关于c# - 在 MainWindows 和 UserControl 之间共享 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38609023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com