0

谁能帮我ItemsSource在我的自定义 Silverlight UserControl 中创建一个属性?

这是我的一个非常简单的 ViewModel:

public class MyVM
{
    public ObservableCollection<int> Values { set; get; }

    public MyVM()
    {
        this.Values = new ObservableCollection<int>();
    }
}

这是我的(内部)UserControl,我将它传递到主 UserContorl(MainPage):

<UserControl x:Class="SilverlightApplication1.SilverlightControl1"
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"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White" >
    <Border BorderBrush="Black" BorderThickness="2">
        <ListBox Margin="5" Name="lst" />
    </Border>
</Grid>
</UserControl>

public partial class SilverlightControl1 : UserControl
{
    public IEnumerable MyItemsSource
    {
        get
        {
            return (IEnumerable)GetValue(MyItemsSourceProperty);
        }
        set
        {
            SetValue(MyItemsSourceProperty, value);
        }
    }
    public static readonly DependencyProperty MyItemsSourceProperty =
        DependencyProperty.Register("MyItemsSource", typeof(IEnumerable), typeof(SilverlightControl1), new PropertyMetadata(null));


    public SilverlightControl1()
    {
        InitializeComponent();
    }
}

这是一个托管我的 UserControl 的小容器:

<UserControl x:Class="SilverlightApplication1.MainPage"
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:local="clr-namespace:SilverlightApplication1"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
    <local:SilverlightControl1 Name="qqq" MyItemsSource="{Binding Path=Values}"/>

</Grid>
</UserControl>

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
        MyVM vm = new MyVM();
        vm.Values.Add(1);
        vm.Values.Add(2);
        vm.Values.Add(3);
        vm.Values.Add(4);

        this.DataContext = vm;
    }
}

如何将数据绑定到我的内部 ListBox?

4

2 回答 2

0

首先,您SilverlightControl1没有自己的 DataContext ,这意味着它正在继承其容器的 DataContext (MainPage在这种情况下)。假设您希望它以这种方式设置,我会回答(而不是 SilverlightControl1 拥有自己的 DC)。说了这么多,MyItemsSource也没用。你可以把它们放在一起。将其从中删除MainPage.xaml并仅包含控件,如下所示:

<Grid x:Name="LayoutRoot" Background="White">
    <local:SilverlightControl1 x:Name="qqq" />
</Grid>

其次,您的 ListBox 不受任何约束。由于它继承了 Main 的 DC,因此您可以Values这样绑定:

<Grid x:Name="LayoutRoot" Background="White" >
    <Border BorderBrush="Black" BorderThickness="2">
        <ListBox Margin="5" Name="lst" ItemsSource="{Binding Values}" />
    </Border>
</Grid>
于 2013-01-21T20:25:19.547 回答
0

我已经完全停止使用 UserControl,部分是因为这个。我改用 CustomControls。可用性和复杂性是完全一样的。您可以使用代码隐藏和单独的模型(尽管我主要使用控件的代码作为模型本身的设置this.DataContext = this;)。我的代码也变得更加结构化(至少我是这么认为的),并且我有更多的可能性来更改控件的 UI。

使用 CustomControls 的唯一缺点是我没有像在 UserControls 和 Windows 中那样的设计界面。UI 被放置在 Generic.xaml 文件中(默认情况下),并通过在编辑器中编写 XAML 来构建,而不是使用鼠标。一开始这很糟糕,但我很快就习惯了。

所以我的回答是,如果你使用 CustomControls,你可以做同样的事情。绑定是这样写的:

MyItemsSource="{Binding RelativeSource="{RelativeSource Mode=TemplatedParent}" Path=Values}"

...或者简单地说:

MyItemsSource="{TemplateBinding Values}"

...如果您不必将任何转换器或其他任何东西添加到绑定中。

于 2013-01-21T22:38:34.963 回答