Usercontrol不同的控件属性访问

时间:2016-08-24 14:12:22

标签: c# wpf xaml mvvm user-controls

我创建了我的第一个WPF MVVM模式解决方案。我创建了一个UserControl,我想在我的MainWindow中重用这个控件,因为样式只是两个控件之间的唯一区别是数据源。 First Control使用ObervableCollection索引0,第二个UserControl使用相同的OberservableCollection索引1. observablecollection在我的Mainviewmodel中,如果我在UserControl中进行绑定,绑定效果很好。

不想将UserControl内部绑定到我的模型中,如下所示:

用户控件:

   <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="PersonModel.FirstName"></TextBlock>
        <TextBlock Grid.Row="1" Text="PersonModel.FirstName"></TextBlock>
    </Grid>

我想在我的MainWindow中绑定我的Usercontrol的每个嵌套控件。

MainWindow.xaml

<desktop:UserControl1 Textblock1.Text="{Binding PersonModel.FirstName} TextBlock2.Text="{Binding PersonModel.LastName}"></desktop:UserControl1>

1 个答案:

答案 0 :(得分:1)

很容易将任何可绑定作为UserControl依赖项属性公开,这里是CustomText一个:

public partial class UserControl1 : UserControl
{
    public string CustomText
    {
        get { return (string)GetValue(CustomTextProperty); }
        set { SetValue(CustomTextProperty, value); }
    }
    public static readonly DependencyProperty CustomTextProperty =
        DependencyProperty.Register("CustomText", typeof(string), typeof(UserControl1), new PropertyMetadata());

    public UserControl1()
    {
        InitializeComponent();
        DataContext = this;
    }
}

在xaml中你绑定它:

<UserControl ... >
    <TextBlock Text="{Binding CustomText}"  />
</UserControl>

用法将是:

<local:UserControl1 CustomText="{Binding SomeProperty" />

另一种方法是使用依赖属性的回调,这样你可以在UserControl后面的代码中改变很多东西,例如开始动画。

我不知道是否有办法公开UserControl的完整子控制,但也许您不需要(而是创建一些专用的依赖属性来更改特定的特定属性)控制)。

另一种可能性是给UserControl一个名称,并在窗口后面的代码中使用它。在这种情况下,您可以通过给出名称(UserControl)并使用属性来公开x:Name控件:

public partial class UserControl1 : UserControl
{
    public TextBlock TextBlock => textBlock; // textBlock is x:Name
    ...
}

现在你可以bind in code来举例说明userControl1.TextBlock.Visibility(其中userControl1x:Name的{​​{1}}。

相关问题