在用户控件 WPF 实例中设置控件值
Setting control values in an instance of a user control WPF
我是 WPF 和 MVVM 的新手,并试图遵循这种设计,我创建了一个 window,上面有多个用户控件(每个 10 个)。这些用户控件将保存一个值,该值应该能够由用户输入并发送回数据库。
我遇到的问题是我在 canvass 中以实用的方式创建用户控件,并且不知道如何使用这些实例在我的视图模型中设置控件上的值,其中我有一个绑定到保存按钮将数据保存到数据库中。感谢您的帮助。
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;
}
}
}
项目控制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>
从技术上讲,您的起点是正确的,因为您正在定义视图和数据上下文。建议使用 XAML 但是如果你刚开始使用 MVVM 没有问题也不矛盾,因为你的代码后面是 View Code behind.
但是问题开始了,例如,您应该使用带有项目模板的 ItemsControl,而不是使用 foreach,它将是 PreAwr 和 ItemsSource ClientRatesPreAwr。这将提供您的 itemscontrol 并通过其自身填充 PreAwr PreAwr UserControl 有一个 tbPreAwrRate 将内容设置为 {Binding ClientRatesPreAwr} 并且它将填充该值。
如果您需要通过代码实现,控件的属性是依赖属性,您可以使用
通过代码绑定它们
https://msdn.microsoft.com/en-us/library/cc838207%28v=vs.95%29.aspx
希望对你有帮助,强烈建议你在XAML中进行设计,如果项目规则可以那样做的话
确实我的文章可能对您有所帮助http://bit.ly/1CoYRkQ
对于阅读本文的任何人,我通过在 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>
我是 WPF 和 MVVM 的新手,并试图遵循这种设计,我创建了一个 window,上面有多个用户控件(每个 10 个)。这些用户控件将保存一个值,该值应该能够由用户输入并发送回数据库。
我遇到的问题是我在 canvass 中以实用的方式创建用户控件,并且不知道如何使用这些实例在我的视图模型中设置控件上的值,其中我有一个绑定到保存按钮将数据保存到数据库中。感谢您的帮助。
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;
}
}
}
项目控制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>
从技术上讲,您的起点是正确的,因为您正在定义视图和数据上下文。建议使用 XAML 但是如果你刚开始使用 MVVM 没有问题也不矛盾,因为你的代码后面是 View Code behind.
但是问题开始了,例如,您应该使用带有项目模板的 ItemsControl,而不是使用 foreach,它将是 PreAwr 和 ItemsSource ClientRatesPreAwr。这将提供您的 itemscontrol 并通过其自身填充 PreAwr PreAwr UserControl 有一个 tbPreAwrRate 将内容设置为 {Binding ClientRatesPreAwr} 并且它将填充该值。
如果您需要通过代码实现,控件的属性是依赖属性,您可以使用
通过代码绑定它们https://msdn.microsoft.com/en-us/library/cc838207%28v=vs.95%29.aspx
希望对你有帮助,强烈建议你在XAML中进行设计,如果项目规则可以那样做的话
确实我的文章可能对您有所帮助http://bit.ly/1CoYRkQ
对于阅读本文的任何人,我通过在 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>