我从observablecollection
构建动态usercontrolcs 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
答案 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>