我想以编程方式创建文本块 但似乎文件背后的代码不构建它。
修改
内部Main.cs
public Main()
{
InitializeComponent();
}
public void generateUI(TypeOne item)
{
// Create first element
TextBlock authorText = new TextBlock();
authorText.Text = "Saturday Morning";
authorText.FontSize = 12;
authorText.FontWeight = FontWeights.Bold;
gridUI.Children.Add(authorText);
}
内部Main.xml
<Page.DataContext>
<ViewModels:MainWindowViewModel/>
</Page.DataContext>
<Grid Width="Auto" Background="WhiteSmoke" x:Name="grid">
<Grid x:Name="gridUI" Margin="0,68,0,-37">
</Grid>
</Grid>
在MainWindowViewModel.cs内部
Main genUI = new Main();
IEnumerable<TypeOne> generateUI = //query variable
from x in _txnType
where x.Description == selectedTypeOne
select x;
foreach (TypeOne ui in generateUI)
{
genUI.generateUI(ui);
}
但是public void generateUI(TypeOne item)没有创建文本块。 我想,由于DataContext设置为MainViewModel.cs
,Main.xml无法读取它请帮忙。
答案 0 :(得分:3)
您希望遵循MVVM模式的事实并不排除动态视图创建。但是我总是建议您使用&#34;仅逻辑&#34;在视图模型中。这意味着VM仍然只包含视图与之交互的逻辑,但绝对不了解视图及其行为。
您的视图是使用视图模型的视图,应该动态调整视图。这意味着在视图的代码隐藏中,您可以访问视图模型,并可以根据当前视图模型自定义视图。您也可以响应视图模型中的更改,因为视图模型将实现INotifyPropertyChanged(您可以像正常绑定一样拦截代码隐藏)。
你应该问自己的问题是MVVM是否适合你。如果UI总是来自数据库,那么绑定定义在哪里?还在数据库中?如果是这样,您在视图模型中实现了哪些实际逻辑?换句话说:如果没有自定义逻辑,VM的重点是什么。在这种情况下,我建议使用仅查看方法。如果您需要自定义逻辑,请使用上面描述的代码隐藏方法。