【问题标题】:WPF Cross User Control Data BindingWPF 跨用户控件数据绑定
【发布时间】:2020-01-17 05:55:35
【问题描述】:

我有两个用户控件,一个带有输入字段控件A),另一个带有数据网格控制 B)。 如何在 WPF在文本框中显示网格视图选定项?是否可以只使用 WPF 或必须在程序代码中执行或两者都执行?

控制A
<UserControl x:Class="PayrollSystem.Controls.EmployeeDetailControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<TextBlock Text="First Name : " Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center"/>
            <StackPanel Margin="2" Grid.Column="1" Grid.Row="2" Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">
                <TextBox x:Name="txtFirstName" Text="{Binding Path=FirstName, Mode=TwoWay}" Width="200"/>
            </StackPanel>

控制 B 与

<UserControl x:Class="PayrollSystem.Controls.EmployeeRecordControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<DataGrid x:Name="dg" AlternatingRowBackground="Gray" CanUserAddRows="False" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName, Mode=TwoWay}"/>
            </DataGrid.Columns>

【问题讨论】:

  • 如果您将两个控件组合到一个控件中,那么工作会容易一些。如果您必须拆分控制,那么您应该遵循 MVVM 模式。这篇文章可能会对你有所帮助。 stackoverflow.com/questions/59635374/…

标签: c# wpf


【解决方案1】:

EmployeeRecordControl 似乎是多余的。取而代之的是,直接使用 DataGrid,并将其 ItemsSourceSelectedItem 绑定到视图模型类的两个属性,如下所示:

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<Employee> Employees { get; }
        = new ObservableCollection<Employee>();

    private Employee selectedEmployee;

    public Employee SelectedEmployee
    {
        get => selectedEmployee;
        set
        {
            selectedEmployee = value;
            PropertyChanged?.Invoke(this,
                new PropertyChangedEventArgs(nameof(SelectedEmployee)));
        }
    }
}

然后像这样创建并绑定到视图模型:

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <DataGrid ItemsSource="{Binding Employees}"
              SelectedItem="{Binding SelectedEmployee}"
              CanUserAddRows="False"/>

    <local:EmployeeDetailControl Grid.Column="1"
                                 DataContext="{Binding SelectedEmployee}"/>
</Grid>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多