Xaml 将附加参数传递给数据模板内的用户控件

Xaml 将附加参数传递给数据模板内的用户控件,xaml,windows-8,windows-runtime,windows-store-apps,winrt-xaml,Xaml,Windows 8,Windows Runtime,Windows Store Apps,Winrt Xaml,这是我正在使用的xaml代码 <GridView Grid.Row="0" x:Name="RootGrid" SelectionMode="None" IsItemClickEnabled="True" ItemsSource="{Binding RootListSource}"> <GridView.ItemTemplate> <Data

这是我正在使用的xaml代码

  <GridView
        Grid.Row="0"
        x:Name="RootGrid"
        SelectionMode="None"
        IsItemClickEnabled="True"
        ItemsSource="{Binding RootListSource}">

        <GridView.ItemTemplate>
            <DataTemplate>
                <UserControl:TreeInfoControl/>
            </DataTemplate>
        </GridView.ItemTemplate>

    </GridView>

在这个my user控件中,它包含另一个GridView,该GridView包含不同的IEnumerable集合。我试图实现的是我需要通过代码传递这个集合。我通过向treecontrol添加依赖项属性尝试了这一点,但它不起作用。因此,我正在寻找一种能够通过xaml(以某种方式通过用户控件)传递集合的解决方案。我知道可以将该集合添加到现有集合并绑定该集合。但现在我不能用那种方法

以下是您的操作方法

从App.xaml开始,这样我们就可以重用演示模板

<Application.Resources>
    <DataTemplate x:Key="MyContentControl">
        <Grid Height="100" Width="100" Background="Maroon">
            <TextBlock Text="{Binding FallbackValue=0}" Foreground="White" FontSize="40" VerticalAlignment="Center" HorizontalAlignment="Center" />
        </Grid>
    </DataTemplate>
</Application.Resources>

你的主页也没有代码隐藏。但视图模型如下所示:

public class MyControlViewModel : BindableBase
{
    public int Number
    {
        get { return (int)GetValue(NumberProperty); }
        set
        {
            SetValue(NumberProperty, value);
            base.RaisePropertyChanged();
        }
    }
    public static readonly DependencyProperty NumberProperty =
        DependencyProperty.Register("Number", typeof(int), typeof(MyControlViewModel),
        new PropertyMetadata(0, (s, e) => { }));

    public string Letter
    {
        get { return (string)GetValue(LetterProperty); }
        set
        {
            SetValue(LetterProperty, value);
            base.RaisePropertyChanged();
        }
    }
    public static readonly DependencyProperty LetterProperty =
        DependencyProperty.Register("Letter", typeof(string), typeof(MyControlViewModel),
        new PropertyMetadata("Z", (s, e) => { }));

    public ObservableCollection<string> Letters
    {
        get { return (ObservableCollection<string>)GetValue(LettersProperty); }
        set
        {
            SetValue(LettersProperty, value);
            base.RaisePropertyChanged();
        }
    }
    public static readonly DependencyProperty LettersProperty =
        DependencyProperty.Register("Letters", typeof(ObservableCollection<string>),
        typeof(MyControlViewModel),
        new PropertyMetadata(new ObservableCollection<string>(new[] { "~W", "~X", "~Y", "~Z" }), (s, e) => { }));
}
public class MainPageViewModel : BindableBase
{
    public MainPageViewModel()
    {
        this._Letters = new ObservableCollection<string>(new[] { "A", "B", "C", "D" });
        this._Numbers = new ObservableCollection<int>(new[] { 1, 2, 3, 4 });
    }

    public string Letter
    {
        get { return (string)GetValue(LetterProperty); }
        set
        {
            SetValue(LetterProperty, value);
            base.RaisePropertyChanged();
        }
    }
    public static readonly DependencyProperty LetterProperty =
        DependencyProperty.Register("Letter", typeof(string), typeof(MyControlViewModel),
        new PropertyMetadata("Z", (s, e) => { }));

    ObservableCollection<string> _Letters = new ObservableCollection<string>();
    public ObservableCollection<string> Letters { get { return _Letters; } }

    ObservableCollection<int> _Numbers = new ObservableCollection<int>();
    public ObservableCollection<int> Numbers { get { return _Numbers; } }
}
public类MainPageViewModel:BindableBase
{
公共MainPageViewModel()
{
这个字母=新的可观察集合(新[]{“A”、“B”、“C”、“D”});
这个._Numbers=新的可观测集合(new[]{1,2,3,4});
}
公共字符串字母
{
获取{return(string)GetValue(LetterProperty);}
设置
{
设置值(LetterProperty,value);
base.RaisePropertyChanged();
}
}
公共静态只读DependencyProperty LetterProperty=
DependencyProperty.Register(“字母”、typeof(字符串)、typeof(MyControlViewModel),
新的属性元数据(“Z”,(s,e)=>{});
ObservableCollection字母=新的ObservableCollection();
公共可观察收集信件{get{return_Letters;}}
ObservableCollection _Numbers=新的ObservableCollection();
公共可观测集合数{get{return}
}
可绑定基础是标准的,下面是代码:

public abstract class BindableBase : DependencyObject, System.ComponentModel.INotifyPropertyChanged
{

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    protected void SetProperty<T>(ref T storage, T value, [System.Runtime.CompilerServices.CallerMemberName] String propertyName = null)
    {
        if (!object.Equals(storage, value))
        {
            storage = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
    protected void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] String propertyName = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    }
}
公共抽象类BindableBase:DependencyObject,System.ComponentModel.INotifyPropertyChanged
{
公共事件System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
受保护的void SetProperty(ref T storage,T value,[System.Runtime.CompilerServices.CallerMemberName]字符串propertyName=null)
{
如果(!object.Equals(存储,值))
{
储存=价值;
if(PropertyChanged!=null)
PropertyChanged(这是新的System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
受保护的void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName]字符串propertyName=null)
{
if(PropertyChanged!=null)
PropertyChanged(这是新的System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
当一切都完成后,你应该得到你想要的。大概是这样的:

public class MyControlViewModel : BindableBase
{
    public int Number
    {
        get { return (int)GetValue(NumberProperty); }
        set
        {
            SetValue(NumberProperty, value);
            base.RaisePropertyChanged();
        }
    }
    public static readonly DependencyProperty NumberProperty =
        DependencyProperty.Register("Number", typeof(int), typeof(MyControlViewModel),
        new PropertyMetadata(0, (s, e) => { }));

    public string Letter
    {
        get { return (string)GetValue(LetterProperty); }
        set
        {
            SetValue(LetterProperty, value);
            base.RaisePropertyChanged();
        }
    }
    public static readonly DependencyProperty LetterProperty =
        DependencyProperty.Register("Letter", typeof(string), typeof(MyControlViewModel),
        new PropertyMetadata("Z", (s, e) => { }));

    public ObservableCollection<string> Letters
    {
        get { return (ObservableCollection<string>)GetValue(LettersProperty); }
        set
        {
            SetValue(LettersProperty, value);
            base.RaisePropertyChanged();
        }
    }
    public static readonly DependencyProperty LettersProperty =
        DependencyProperty.Register("Letters", typeof(ObservableCollection<string>),
        typeof(MyControlViewModel),
        new PropertyMetadata(new ObservableCollection<string>(new[] { "~W", "~X", "~Y", "~Z" }), (s, e) => { }));
}
public class MainPageViewModel : BindableBase
{
    public MainPageViewModel()
    {
        this._Letters = new ObservableCollection<string>(new[] { "A", "B", "C", "D" });
        this._Numbers = new ObservableCollection<int>(new[] { 1, 2, 3, 4 });
    }

    public string Letter
    {
        get { return (string)GetValue(LetterProperty); }
        set
        {
            SetValue(LetterProperty, value);
            base.RaisePropertyChanged();
        }
    }
    public static readonly DependencyProperty LetterProperty =
        DependencyProperty.Register("Letter", typeof(string), typeof(MyControlViewModel),
        new PropertyMetadata("Z", (s, e) => { }));

    ObservableCollection<string> _Letters = new ObservableCollection<string>();
    public ObservableCollection<string> Letters { get { return _Letters; } }

    ObservableCollection<int> _Numbers = new ObservableCollection<int>();
    public ObservableCollection<int> Numbers { get { return _Numbers; } }
}

不要过分简化事情。但是,这很容易

听着,当您开始嵌套上下文时,让您的头脑围绕XAML并不总是容易的。我不怪你第一次没拿到。但我希望这能帮助你开始。继续推动


祝你好运

我也在寻找解决这个问题的办法。在WPF中,这是可能的。很遗憾,你不能使用有效的技术。谢谢尼克松。这对我帮助很大。谢谢你的建议……)