在用户控件 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>