如何访问绑定到UserControl的ItemsControl项目的项目?

时间:2018-07-27 19:25:27

标签: c# wpf user-controls itemscontrol

(我正在努力明确地问我的问题,如果不清楚,抱歉。)

我想访问已绑定到UserControl的ItemsControl的项目,但是我不知道它绑定到了什么属性。这是一个示例:

<ItemsControl ItemsSource="{Binding Path=Widgets}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:WidgetView/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

其中“小部件”是以下类实例的集合:

public class Widget
{
    public int Data { get; set; }
    public int OtherData { get; set; }
    public Widget() {}
}

“ WidgetView”是一个UserControl:

<UserControl x:Class="TestApp.WidgetView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:TestApp">
    <WrapPanel>
        <TextBlock Text="{Binding Path=Data, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        <Button Content="Set Other Data" Click="btn_clicked"/>
    </WrapPanel>
</UserControl>

带有代码后盖:

public partial class WidgetView : UserControl
{
    public WidgetView() {}
    private void btn_clicked(object sender, RoutedEventArgs e)
    {
        (???).OtherData = 42;
    }
}

在后面的代码中,我将如何访问ItemsControl中绑定到“ WidgetView”的“ Widget”实例?

1 个答案:

答案 0 :(得分:2)

正如Crowcoder所说;您通常可以通过ICommand进行此操作,而无需进行任何代码隐藏。

话虽这么说;几次需要此方法,您都可以通过DataContext访问它。那是一个对象,所以您需要强制转换:

private void btn_clicked(object sender, RoutedEventArgs e)
    {
         var widget = (Widget)DataContext; //Or a safer cast!
         widget.OtherData = 42;
    }