从绑定用户控件访问Datacontext

时间:2016-02-18 13:21:47

标签: c# wpf mvvm binding user-controls

我从observablecollection

构建动态usercontrol

cs code:

 <android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/imageViewplaces"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:src="@drawable/pyrros" />

        <android.support.design.widget.TabLayout
            android:id="@+id/caj_tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@id/imageViewplaces"
            android:elevation="6dp"
            android:minHeight="?attr/actionBarSize"
            app:tabTextAppearance="@style/MineCustomTabText"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            android:layout_marginTop="12dp"
            app:titleTextAppearance="@style/Toolbar.TitleText" />

    </RelativeLayout>


</android.support.design.widget.AppBarLayout>

XAML

 public  static ObservableCollection<Model.Model.ControleData> ListControleMachine = new ObservableCollection<Model.Model.ControleData>();



     public Genkai(string Autorisation)
            {

                InitializeComponent();

                DataContext = this;

               icTodoList.ItemsSource = ListControleMachine;
               Model.Model.ControleData v = new Model.Model.ControleData();
               v.ComputerName = "M57095";
               v.ImportSource = "LOAD";
               ListControleMachine.Add(v);
    }

所以在我看来,我有一个类型&#34; <ItemsControl x:Name="icTodoList" ItemsSource="{Binding ListControleMachine}" > <ItemsControl.ItemTemplate> <DataTemplate DataType="{x:Type local:ControlMachineII}"> <local:ControlMachineII /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> &#34;的用户控件;与Model.Model.ControleData()绑定,但我如何从usercontrole c#代码访问ControleData?

例如,我想删除带有关闭按钮的usercontrole本身,我至少需要访问ControleData.ComputerName值,然后从Mainform.ListControleMachine中删除它。

无法找到实现此目的的最佳做法,并在usercontrole代码中使用我的数据。

删除按钮代码就像我想的那样(带有硬编码值)

local:ControlMachineII

2 个答案:

答案 0 :(得分:0)

我看到你今天发布了同样的question更多数据。我将使用该数据提供解决方案。

解决方案1:

使用按钮的Tag属性,如下所示:

<Button Content="Close this UC" HorizontalAlignment="Left" Margin="414,22,0,0" 
            VerticalAlignment="Top" Width="119" Click="Button_Click" Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />

事件处理程序:

private void Button_Click(object sender, RoutedEventArgs e)
    {
         var button = sender as Button;
         List<object> list = (button.Tag as ItemsControl).ItemsSource.OfType<TodoItem>().ToList<object>();
        list.Remove(button.DataContext);
        (button.Tag as ItemsControl).ItemsSource = list;
    }

解决方案2:

更优雅的解决方案:

Style

中创建此MainWindow
<Window.Resources>
    <Style TargetType="Button">
        <EventSetter Event="Click" Handler="Button_Click"/>
    </Style>
</Window.Resources>
  

现在,任何Button后代Click控制中的任何MainWindow's Button事件的处理程序都位于MainWindow.xaml.cs。< / EM>

然后将handler方法放入MainWindow.xaml.cs并更改handler,如下所示:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        var button = sender as Button;
        items.Remove(button.DataContext as TodoItem);
        icTodoList.ItemsSource = null;
        icTodoList.ItemsSource = items;            
    }

答案 1 :(得分:0)

我最终发现我的DataContext在开始时尚未初始化,为什么我收到错误所以我必须先等待datacontext:这里有修正代码

<script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
      m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

      ga('create', 'UA-XXXXX-X', 'auto', {'allowLinker': true});
      ga('require', 'linker');
      ga('linker:autoLink', ['domain2.com'] );
      ga('send', 'pageview');

</script>