WPF:将属性从用户控件绑定到 ViewModel

本文关键字:控件 绑定 ViewModel 用户 属性 WPF | 更新日期: 2023-09-27 18:36:44

>我有一个名为 AntecedentControl 的用户控件:

XAML:

<UserControl x:Name="AntecedentUserControl">
<ScrollViewer DataContext="{Binding ElementName=AntecedentUserControl}">
    <telerik:RadGridView ItemsSource="{Binding Path=AntecedentList}"
                         AutoGenerateColumns="False"
        <telerik:RadGridView.Columns>
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Section, Mode=TwoWay}"
                                        Header="Seccion"
                                        IsVisible="True"
                                        IsFilterable="False"/>
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Group, Mode=TwoWay}"
                                    Header="Grupo"
                                    IsVisible="True"
                                    IsFilterable="False"/>
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Tome, Mode=TwoWay}"
                                    Header="Tomo"
                                    IsVisible="True"
                                    IsFilterable="False"/>
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Volume, Mode=TwoWay}"
                                    Header="Volumen"
                                    IsVisible="True"
                                    IsFilterable="False"/>
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Inscription, Mode=TwoWay}"
                                    Header="Inscripcion"
                                    IsVisible="True"
                                    IsFilterable="False"/>
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Bis, Mode=TwoWay}"
                                    Header="Bis"
                                    IsVisible="True"
                                    IsFilterable="False"/>
            <telerik:GridViewColumn>
                <telerik:GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <telerik:RadButton Content="Delete"
                                           Command="telerikGrid:RadGridViewCommands.Delete"
                                           CommandParameter="{Binding}"/>
                    </DataTemplate>
                </telerik:GridViewColumn.CellTemplate>
            </telerik:GridViewColumn>
        </telerik:RadGridView.Columns>
    </telerik:RadGridView>
</ScrollViewer>

代码隐藏 (C#):

public partial class AntecedentControl : UserControl
{
    public ObservableCollection<Antecedent> AntecedentList
    {
        get { return (ObservableCollection<Antecedent>)GetValue(AntecedentListProperty); }
        set { SetValue(AntecedentListProperty, value); }
    }
    public static readonly DependencyProperty AntecedentListProperty =
        DependencyProperty.Register("AntecedentList",
        typeof(ObservableCollection<Antecedent>),
        typeof(AntecedentControl),
        new FrameworkPropertyMetadata(new ObservableCollection<Antecedent>(), OnListPropertyChanged));
    private static void OnListPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        var antecedentList = source as AntecedentControl;
        var value = e.NewValue as ObservableCollection<Antecedent>;
        antecedentList.AntecedentList = value;
    }
    public AntecedentControl()
    {
        InitializeComponent();
    }
}

而且,在另一个视图上,我称之为UserControl,如下所示:

<DomainTransmissionControls:AntecedentControl AntecedentList="{Binding ElementName=AntecedentUserControl, Path=Antecedents, Mode=TwoWay}"/>

在这个单独视图的视图模型上,我有一个名为"前因"的属性:

public ObservableCollection<Antecedent> Antecedents { get; set; }

简而言之:AntecedentControl UC是一个网格,它具有一种方法,您可以在其中添加/编辑所述网格上的项目。当前 UC 的属性"AntecedentList"是"保存"列表的位置。

调用"AntecedentControl"

的另一个 UC 的 ViewModel 的属性"Antecedents"应绑定到 AntecedentControl UC 的"AntecedentList"。

我想知道如何将视图模型上的此属性绑定到在单独的用户控件(AntecedentControl)中找到的属性"AntecedentList"属性,因为此当前代码返回 null。

我相信我在 AntecedentControl UC 上的 DependencyProperty 声明有问题,因为在"OnListPropertyChanged"方法上放置断点会显示 e.NewValue 返回 null。

如果是这样,为什么不返回依赖属性语句中声明的默认值?

谢谢你的时间。

WPF:将属性从用户控件绑定到 ViewModel

您的绑定似乎不正确。您似乎正在尝试访问您创建的 UserControl 中的元素(AntecedentUserControl)?

除非你为了简单起见省略了一些代码,否则实际上你甚至不需要依赖属性?有什么原因不能设置数据上下文吗?

SomeView.xaml

<DomainTransmissionControls:AntecedentControl DataContext="{Binding Antecedents}" />

某视图模型.cs

private ObservableCollection<Antecedent> _antecedents;
public ObservableCollection<Antecedent> Antecedents
{
    get
    {
        if (_antecedents == null)
            _antecedents = new ObservableCollection<Antecedent>();
        return _antecedents;
    }
}

AntecedentControl.xaml

<UserControl>
    <ScrollViewer>
       <telerik:RadGridView ItemsSource="{Binding}" AutoGenerateColumns="False">
            <telerik:RadGridView.Columns>
                <telerik:GridViewDataColumn DataMemberBinding="{Binding Section, Mode=TwoWay}"
                                            Header="Seccion" IsFilterable="False" IsVisible="True" />
                <!-- Additional column definitions. -->
            </telerik:RadGridView.Columns>
        </telerik:RadGridView>
    </ScrollViewer>
</UserControl>

AntecedentControl.xaml.cs

public partial class AntecedentControl : UserControl
{
    public AntecedentControl()
    {
        InitializeComponent();
    }
}