我是WPF和MVVM的新手,并试图遵循这个设计,我创建了一个窗口,上面有多个用户控件(每个10个)。这些用户控件将保存一个值,该值应该能够由用户输入并发送回数据库。
我遇到的问题是我在一个游戏中实际创建用户控件,并且不知道如何使用这些实例从我的视图模型设置控件上的值,其中我有一个绑定到保存按钮的SaveMethod将数据保存到数据库中。谢谢你的帮助。
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ClientRatesViewModel viewModel = new ClientRatesViewModel();
DataContext = viewModel;
viewModel.GetChargeUnits();
int previousTopPreRate = 10;
foreach (var rate in viewModel.ClientRatesPreAwr)
{
PreAwr preAwr = new PreAwr();
preAwr.tbPreAwrRate.Text = rate.ClientRatesPreAwr;
PreRatesCanvas.Children.Add(preAwr);
preAwr.Width = 500;
Canvas.SetLeft(preAwr, 10);
Canvas.SetTop(preAwr, previousTopPreRate + 10);
previousTopPreRate += +30;
}
int previousTopPostRate = 10;
foreach (var rate in viewModel.ClientRatesPostAwr)
{
PostAWR postAwr = new PostAWR();
postAwr.tbPostAwrRate.Text = rate.ClientRatesPostAwr;
PostRatesCanvas.Children.Add(postAwr);
postAwr.Width = 500;
Canvas.SetLeft(postAwr, 10);
Canvas.SetTop(postAwr, previousTopPostRate + 10);
previousTopPostRate += +30;
}
}
}
ItemsControl XAML:
<ItemsControl Name="icPreAwr" Margin="10,46,10,10">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding ClientRatesPreAwr }" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 0 :(得分:0)
从技术上讲,你是正确的,因为你正在定义视图和datacontext。建议使用XAML但是如果你开始没有问题,也没有与MVVM的矛盾,因为你的代码背后是View Code。
但是这里开始出现问题,例如,不应该使用foreach,而应该使用带有itemtemplate的ItemsControl,它将是PreAwr和ItemsSource ClientRatesPreAwr。这将提供你的itemscontrol并通过itseld填充PreAwr PreAwr UserControl有一个tbPreAwrRate将内容设置为{Binding ClientRatesPreAwr},它将填充该值。
如果需要通过代码进行此操作,控件的属性是依赖项属性,您可以使用
通过代码绑定它们https://msdn.microsoft.com/en-us/library/cc838207%28v=vs.95%29.aspx
我希望它对您有所帮助,我强烈建议您在XAML中设计步骤,如果项目规则能够以这种方式完成
确实,我的文章可能会对您有所帮助http://bit.ly/1CoYRkQ
答案 1 :(得分:0)
对于阅读此内容的人,我设法通过在我的XAML中执行以下操作来实现此目的。
<ListBox ItemsSource="{Binding ClientRatesPreAwr}"
KeyboardNavigation.TabNavigation="Continue" Margin="0,58,0,69">
<ItemsControl.ItemContainerStyle>
<Style TargetType="ListBoxItem">
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="2" Focusable="False">
<UserControls:PreAwr />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>