gpt4 book ai didi

c# - 如何分离 View 数据和 ViewModel 数据?

转载 作者:行者123 更新时间:2023-12-03 10:27:57 25 4
gpt4 key购买 nike

我需要分别管理 UI 特定参数( View )和应用程序数据(模型/ View 模型),所以我首先使用 View 的代码隐藏,然后使用单独的类(前缀 ViewModel)。这是我所拥有的简化版本:

查看 (XAML)

<Window x:Class="UrSimulator.View.MyView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MyView" Height="300" Width="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding FirstColumnWidth}" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel>
<Label>Width:</Label>
<TextBox Text="{Binding FirstColumnWidth}" IsReadOnly="True" Background="LightGray" />
</StackPanel>
<StackPanel Grid.Column="1">
<Label>First Column Width:</Label>
<TextBox Text="{Binding FirstColumnWidth}" />
<Label>View Model Data:</Label>
<TextBox Text="{Binding MyViewModel.PropertyFromVM}" />
<Label Content="{Binding MyViewModel.PropertyFromVM}" />
</StackPanel>
</Grid>

查看(代码隐藏)
public partial class MyView : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

private MyViewModel m_MyViewModel;
public MyViewModel MyViewModel
{
get { return m_MyViewModel; }
set
{
m_MyViewModel = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("MyViewModel"));
}
}

private GridLength m_FirstColumnWidth;
public GridLength FirstColumnWidth
{
get { return m_FirstColumnWidth; }
set
{
m_FirstColumnWidth = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("FirstColumnWidth"));
}
}

public MyView()
{
MyViewModel = new MyViewModel();
DataContext = this;
FirstColumnWidth = new GridLength(100);
InitializeComponent();
}
}

查看型号
public class MyViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

private string m_PropertyFromVM;
public string PropertyFromVM
{
get { return m_PropertyFromVM; }
set
{
m_PropertyFromVM = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("PropertyFromVM"));
}
}

public MyViewModel()
{
PropertyFromVM = "Some business data";
}
}

它有效,但我发现使用 MyViewModel. 很麻烦在指向 VM 的每个绑定(bind)上。

问题:

有没有不使用前缀的另一种方法来做到这一点?

如果不使用 this,我应该如何编写 UI 的绑定(bind)(宽度属性)对于 DataContext,我会使用:
DataContext = MyViewModel;

我做错了一切,这不是它的本意?

注:忘记宽度所需的转换器,只要文本有效并且不是我关心的问题,它就可以工作。

最佳答案

DataContext = this;

哎呀... :)

让 View 模型成为数据上下文,并像这样绑定(bind) View 的属性:
<Window x:Name="This" ...>
...
<SomeControl SomeProperty="{Binding MyViewProperty, ElementName=This}"/>
...
</Window>

边注 :
class MyView : Window, INotifyPropertyChanged

如果继承 Window ,为什么 View 的属性不是“依赖属性”?

关于c# - 如何分离 View 数据和 ViewModel 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28584456/

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