在用户控件WPF的实例中设置控制值

时间:2015-04-03 18:06:15

标签: c# wpf xaml mvvm

我是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>

2 个答案:

答案 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>