【问题标题】:Setting control values in an instance of a user control WPF在用户控件 WPF 的实例中设置控件值
【发布时间】:2015-04-03 18:06:15
【问题描述】:

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

【问题讨论】:

  • 删除所有代码并使用正确的 XAML。使用 ItemsControls(或派生控件,例如 ListBoxes)来显示数据项的集合。从这里开始阅读:Data Templating Overview.
  • 不。没有。不开开。呜呜呜。以下是如何正确地做到这一点(不是 100% 符合您的问题,但请遵循,您就会明白):stackoverflow.com/a/29132115/1228
  • @Clemens 谢谢,可以将用户控件添加到列表框,还是您的意思是在我的用户控件中创建包含数据的列表框项目?
  • 如有必要,您当然可以在 ListBox 的 ItemTemplate 中使用 UserControl。只需将其添加到 DataTemplate 中的元素树即可。

标签: c# wpf xaml mvvm


【解决方案1】:

从技术上讲,您的开始是正确的,因为您正在定义视图和数据上下文。建议使用 XAML,但如果您开始使用 MVVM 没有问题也没有矛盾,因为您的代码背后是 View Code behind。

但是问题就从这里开始了,例如,您应该使用 ItemsControl 和 itemtemplate,而不是使用 foreach,该 itemtemplate 将是 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

【讨论】:

  • 谢谢 有没有可以使用我的代码提供的示例?我正在努力让这个工作我已经添加了我到目前为止的问题,谢谢
【解决方案2】:

对于阅读本文的任何人,我设法通过在我的 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>

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 2016-07-05
    • 1970-01-01
    • 2013-07-18
    • 2014-12-12
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多