使用XAML UserControl和dataobject作为属性,作为Gridview中的DataTemplate - 绑定

时间:2015-05-21 10:11:18

标签: xaml listview binding user-controls data-objects

我有一个带有dependencyproperties的对象集合,以及Observer patern,因为我在" AssetIHM"中提供了实时数据。对象

 public class assetVM: DependencyObject ,IObserver
{


    public assetVM(AssetIHM aihm) 
    {
        ObserverCollectionSingleton.ObserverCollectionInstance.Add(this);
        _aihm = aihm;
    }

    private string _assetname;
    public string assetname
    {
        get { return _assetname; }
        set
        {
            _assetname = value;
            SetValue(assetnameprop, value);
        }
    }
    public static readonly DependencyProperty assetnameprop =
    DependencyProperty.Register("assetnameprop",    typeof(string),typeof(assetVM), new UIPropertyMetadata(""));
    ...

我还有一个UserControl,它应该显示AssetVM对象中包含的信息:

 public partial class AssetPanel : UserControl
{ 
    public assetVM Asset 
    {
        get
        {
            return (assetVM)GetValue(assetProperty);
        }
        set
        {
            SetValue(assetProperty, value);
        }

    }
    public static DependencyProperty assetProperty =    DependencyProperty.Register(
       "Asset", typeof(assetVM), typeof(AssetPanel), new   PropertyMetadata(null, new PropertyChangedCallback(OnCurrentItemChanged)));

    public AssetPanel(assetVM _Asset)
    {
        Asset = _Asset;
        this.DataContext = this;
        InitializeComponent();
        ...
    }

    public AssetPanel( )
    {
        this.DataContext = this;
        InitializeComponent();
        ...
    }
    ...

我的主窗口,我有一个ListBox,

<Window x:Class="ETRportfolio.MainWindow"        
    DataContext = "{Binding RelativeSource={RelativeSource Self}}"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:UserControls="clr-namespace:ETRportfolio"  
    Title="MainWindow" Height="1200" Width="1425">



<StackPanel HorizontalAlignment="Left" Height="1153" VerticalAlignment="Top" Width="1400" Margin="10,10,-18,0">

    <ListBox  x:Name="Gridview" Height="800"    >
         <ListBox.ItemTemplate>
            <DataTemplate>
                <UserControls:AssetPanel Asset="{Binding}" />
            </DataTemplate>
         </ListBox.ItemTemplate>
    </ListBox>
</StackPanel>

我的问题是我想用我的Usercontrol提供包含的数据是AssetVM的集合。

public partial class MainWindow : Window
{

    public static Dispatcher curDispatcher;

    public ObservableCollection<assetVM> Datas
    {
        get
        {
            return (ObservableCollection<assetVM>)curDispatcher.Invoke(
                       System.Windows.Threading.DispatcherPriority.DataBind,
                       (DispatcherOperationCallback)delegate { return GetValue(DataSProperty); },
                       DataSProperty);
        }
        set
        {
            curDispatcher.BeginInvoke(DispatcherPriority.DataBind,
                (SendOrPostCallback)delegate { SetValue(DataSProperty, value); },
                value);
        }
    }

    public readonly DependencyProperty DataSProperty = DependencyProperty.Register("DataS", typeof(ObservableCollection<assetVM>), typeof(MainWindow), new PropertyMetadata(null, new PropertyChangedCallback(OnCurrentItemChanged)));
    public MainWindow()
    {

        this.DataContext = this;
        curDispatcher = this.Dispatcher;
        Datas =new ObservableCollection<assetVM>();


        InitializeComponent();
        Gridview.ItemsSource = Datas; 
        addasset.addbtn.Click += onclik;
    }

创建AssetPanel构造函数时,它不会与My AssetVM数据绑定。我总是通过空构造函数。

我如何在XAML中做到这一点?
我猜问题就在那里:

ListBox.ItemTemplate>
            <DataTemplate>
                <UserControls:AssetPanel Asset="{Binding}" />
            </DataTemplate>
         </ListBox.ItemTemplate>

THKS!

编辑::

我删除了this.DataContext = this;

在UserControl构造函数中,但是当一个DataObject

时调用UserControl构造函数
assetVM

被添加到ObservableCollection数据中,用作Listview的数据源,这是空构造函数。但不是:

 public AssetPanel(assetVM _Asset)
>     {
>         Asset = _Asset; 
>         InitializeComponent();
>         ValuationInfo.ItemsSource = new List<string> { "%", "Value" };
>         AVbox.ItemsSource = Enum.GetValues(typeof(AV)).Cast<AV>();
>     }

所以它没有绑定。

EDIT2 ::

 private static void OnCurrentItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {

            AssetPanel instance = (AssetPanel)d;
            instance.Asset = (assetVM)e.NewValue;
            return;
        }

它绑定! :)

尽管如此,数据对象中的Registered Dependency属性不会显示。

这是我的Assetpanel xaml:

<UserControl x:Class="ETRportfolio.AssetPanel" 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
             mc:Ignorable="d" 
             d:DesignHeight="152" d:DesignWidth="1400">
    <Grid  >
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Border BorderBrush="#FFDE6A6A" BorderThickness="1" Grid.Row="0" Grid.Column="0" Background="lightblue">
            <TextBlock x:Name="assetnamebox" TextWrapping="Wrap" Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl }, Path = assetnameprop, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="15"/>
        </Border>
   ...

TextBlock x:Name =&#34; assetnamebox&#34; TextWrapping =&#34;包覆与#34; Text =&#34; {Binding RelativeSource = {RelativeSource AncestorType = UserControl},Path = assetnameprop,

未与assetVM.assetname绑定通过DependencyProperty assetnameprop。

那里有什么问题?

THKS

1 个答案:

答案 0 :(得分:1)

将UserControl的DataContext设置为自身,就像语句

在构造函数中所做的那样
this.DataContext = this;

有效地禁用绑定到继承的DataContexts的属性,例如

<ListBox.ItemTemplate>
    <DataTemplate>
        <UserControls:AssetPanel Asset="{Binding}" />
    </DataTemplate>
</ListBox.ItemTemplate>

其中绑定源是ListBoxItems的继承DataContext,即assetVM实例。

从UserContr的构造函数中删除DataContext赋值。