在使用点,如何将数据杂志分配给WPF中的用户控件



我正在尝试为典型的二元列表情况定义一个用户控件(其中有两个物品列表并排和按钮控件,以导致从一个项目转移到一个项目中其他(。我不是很精通WPF-我学到的大部分内容都是通过这样的网站零碎的。我了解到,我可以为控件创建自定义依赖属性属性,以便可以将控件中的项目(按钮,文本框等(推迟绑定,直到实际使用控件为止。但是,对于我的控件,我将拥有这两个列表(可能是因为我的大多数代码迄今已涉及到它们(,但是它们需要比绑定更多,所以我想做的就是这样的事情:

    <MyUserControl . . . .>
        <DataGrid . . . .>
        <DataGrid . . . .>
    </MyUserControl>

,但我不知道如何做到这一点。我认为可能有某种方法可以将ContentControls用作数据杂志的替身,然后以某种方式将数据杂志链接回USerControl中的ContentControls,但我不太了解ContentControls,我发现使用它们的示例似乎都没有完全适用于我想做的事情。

有人可以将我指向正确的方向吗?谢谢。

我做了更多的研究,并在这里找到了一种有希望的方法:如何通过用户的XAML动态地添加控件?

我做了一个小的概念验证项目,它效果很好,所以我想在这里分享。它使用Galasoft的MVVM轻框架。

我创建了一个用文本块,一个contentControl和一个按钮的用户控件:

    <UserControl x:Class="DataGridInUserControlDemo.UserControls.DGPlusUC"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:ignore="http://www.galasoft.ch/ignore"
            mc:Ignorable="d ignore"
            x:Name="ControlRoot">
        <Grid DataContext="{Binding ElementName=ControlRoot}" Margin="10, 10, 10, 10" MinHeight="300" MinWidth="300">
            <Grid.RowDefinitions>
                <RowDefinition Height="1*"/>
                <RowDefinition Height="5*"/>
                <RowDefinition Height="2*"/>
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" Text="{Binding Path=BannerText}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="20"/>
            <ContentControl Grid.Row="1" Content="{Binding Path=InnerContent}" />
            <Button Grid.Row="2" x:Name="DemoButton" Content="{Binding Path=ButtonContent}" Command="{Binding Path=ButtonCommand}" Width="75" Height="25" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </Grid>
    </UserControl>

我希望将userControl外部绑定的属性本身与自定义依赖关系绑定。

这是包含依赖关系定义的用户控件的代码 - 刺激:

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    namespace DataGridInUserControlDemo.UserControls
    {
        public partial class DGPlusUC : UserControl
        {
            public DGPlusUC()
            {
                InitializeComponent();
            }
            public const string BannerTextPropertyName = "BannerText";
            public string BannerText
            {
                get
                {
                    return (string)GetValue(BannerTextProperty);
                }
                set
                {
                    SetValue(BannerTextProperty, value);
                }
            }
            public static readonly DependencyProperty BannerTextProperty = DependencyProperty.Register(
                BannerTextPropertyName,
                typeof(string),
                typeof(DGPlusUC));
            public const string ButtonContentPropertyName = "ButtonContent";
            public string ButtonContent
            {
                get
                {
                    return (string)GetValue(ButtonContentProperty);
                }
                set
                {
                    SetValue(ButtonContentProperty, value);
                }
            }
            public static readonly DependencyProperty ButtonContentProperty = DependencyProperty.Register(
                ButtonContentPropertyName,
                typeof(string),
                typeof(DGPlusUC));
            public const string ButtonCommandPropertyName = "ButtonCommand";
            public ICommand ButtonCommand
            {
                get
                {
                    return (ICommand)GetValue(ButtonCommandProperty);
                }
                set
                {
                    SetValue(ButtonCommandProperty, value);
                }
            }
            public static readonly DependencyProperty ButtonCommandProperty = DependencyProperty.Register(
                ButtonCommandPropertyName,
                typeof(ICommand),
                typeof(DGPlusUC));
            public const string InnerContentPropertyName = "InnerContent";
            public UIElement InnerContent
            {
                get
                {
                    return (UIElement)GetValue(InnerContentProperty);
                }
                set
                {
                    SetValue(InnerContentProperty, value);
                }
            }
            public static readonly DependencyProperty InnerContentProperty = DependencyProperty.Register(
                InnerContentPropertyName,
                typeof(UIElement),
                typeof(DGPlusUC));
        }
    }

这是主窗口的XAML:

    <Window x:Class="DataGridInUserControlDemo.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:ignore="http://www.galasoft.ch/ignore"
            xmlns:demo="clr-namespace:DataGridInUserControlDemo.UserControls"
            mc:Ignorable="d ignore"
            Height="400"
            Width="400"
            Title="MVVM Light Application"
            DataContext="{Binding Main, Source={StaticResource Locator}}">
        <Window.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Skins/MainSkin.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Window.Resources>
        <Grid x:Name="LayoutRoot">
            <demo:DGPlusUC BannerText="{Binding UCTitle}"  ButtonContent="{Binding ButtonText}" ButtonCommand="{Binding ButtonCommand}" HorizontalAlignment="Center" VerticalAlignment="Center">
                <demo:DGPlusUC.InnerContent>
                    <Grid DataContext="{Binding Main, Source={StaticResource Locator}}">
                        <DataGrid ItemsSource="{Binding Path=DataItems}" AutoGenerateColumns="True" />
                    </Grid>
                </demo:DGPlusUC.InnerContent>
            </demo:DGPlusUC>
        </Grid>
    </Window>

自定义依赖性property(S(用作控件中的标签,以绑定到ViewModel中的属性。

注意包围的demo:DGPlusUC.InnerContent-这是ContentControl的替换代码所在的位置。嵌入的UserControl继承了窗口的数据台面,但由于某种原因,本节没有进行尝试,在尝试一下之后,我只是举起了手并明确声明了DataContext。

这是ViewModel代码:

    using GalaSoft.MvvmLight;
    using GalaSoft.MvvmLight.CommandWpf;
    using DataGridInUserControlDemo.Model;
    using System.Windows.Input;
    using System.Collections.ObjectModel;
    namespace DataGridInUserControlDemo.ViewModel
    {
        public class MainViewModel : ViewModelBase
        {
            private readonly IDataModel theModel;
            private ObservableCollection<DataItem> _DataItems;
            public ObservableCollection<DataItem> DataItems
            {
                get
                {
                    return _DataItems;
                }
                set
                {
                    if (_DataItems == value)
                    {
                        return;
                    }
                    var oldValue = _DataItems;
                    _DataItems = value;
                    RaisePropertyChanged(() => DataItems, oldValue, value, true);
                }
            }

            private string _ButtonText = "First";
            public string ButtonText
            {
                get
                {
                    return this._ButtonText;
                }
                set
                {
                    if (this._ButtonText == value)
                    {
                        return;
                    }
                    var oldValue = this._ButtonText;
                    this._ButtonText = value;
                    RaisePropertyChanged(() => ButtonText, oldValue, value, true);
                }
            }

            private string _UCTitle = string.Empty;
            public string UCTitle
            {
                get
                {
                    return this._UCTitle;
                }
                set
                {
                    if (this._UCTitle == value)
                    {
                        return;
                    }
                    var oldValue = this._UCTitle;
                    this._UCTitle = value;
                    RaisePropertyChanged(() => UCTitle, oldValue, value, true);
                }
            }
            private ICommand _ButtonCommand;
            public ICommand ButtonCommand
            {
                get
                {
                    return this._ButtonCommand;
                }
                set
                {
                    if (this._ButtonCommand == value)
                    {
                        return;
                    }
                    var oldValue = this._ButtonCommand;
                    this._ButtonCommand = value;
                    RaisePropertyChanged(() => ButtonCommand, oldValue, value, true);
                }
            }
            public MainViewModel(IDataModel model)
            {
                this.theModel = model;
                this._UCTitle = "DataGrid in User Control Demo";
                this._DataItems = new ObservableCollection<DataItem>(this.theModel.SomeData);
                this._ButtonCommand = new RelayCommand(this.ButtonCmd, () => { return true; }) ;
            }
            private void ButtonCmd()
            {
                if (this.ButtonText == "First")
                {
                    this.ButtonText = "Second";
                }
                else
                {
                    this.ButtonText = "First";
                }
            }
        }
    }

最后,这是结果:

usercontrol演示中的datagrid

最新更新