0

タブ コントロールがあります...タブ項目が動的に追加されます。各タブ項目にはデータ グリッドが含まれています。私のタブ コントロールは

 <TabControl Grid.Row="1" Name="tabControl"  ItemsSource="{Binding TabItems}" ContentTemplate="{DynamicResource DataTemplate1}" >
            </TabControl>

テンプレート...

<Window.Resources>
        <DataTemplate x:Key="DataTemplate1">
            <Grid>
                <DataGrid ItemsSource="{Binding Path=GridSource,UpdateSourceTrigger=PropertyChanged}"></DataGrid>
     </Grid>
        </DataTemplate>
    </Window.Resources>




public MainWindowViewModel()
        {
            NewCmnd = new RelayCommand(NewCommandExecute, NewCommandCanExecute);
            TabItems = new ObservableCollection<TabItem>();
            GridSource = new DataTable();
            GridSource.Columns.Add("Column1");
            GridSource.Columns.Add("Column2");
            GridSource.Columns.Add("Column3");
        }

        public ObservableCollection<TabItem> TabItems
        {
            get;
            set;
        }
        public DataTable GridSource
        {
            get
            {
                return dt;
            }
            set
            {
                dt = value;
                OnPropertyChanged(new PropertyChangedEventArgs("GridSource"));
            }
        }

そして、タブ項目を次のように追加しています

TabItems.Add(new TabItem());
            DataRow dr = GridSource.NewRow();
            dr["Column1"] = "abc";
            dr["Column2"] = "abc";
            dr["Column3"] = "abc";
        GridSource.Rows.Add(dr);

しかし、私のUIは更新されていません..誰でも考えられる理由を教えてもらえますか?

4

1 に答える 1

1

UI を更新するために必要な通知メカニズムを DataTable が実装しているかどうかはわかりません。あなたのコードから、 DataTable を作成し、それにデータを追加してからプロパティ "GridSource" を設定するという簡単な代替案を提案できます。

新しいDataTableを作成し、この時点で「GridSource」に設定すると、既存のコードプロパティが変更され、DataTableが空になり、それに応じてUIがレンダリングされます。

アップデート

私のxamlコード:

<Window.Resources>
    <DataTemplate x:Key="DataTemplate1">
        <Grid MinHeight="100">
            <Grid.RowDefinitions>
                <RowDefinition Height="25"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Button Content="Add Row" Click="Button_Click" Grid.Row="0"></Button>
            <DataGrid ItemsSource="{Binding Data}" AutoGenerateColumns="True" Grid.Row="1"/>
        </Grid>
    </DataTemplate>
</Window.Resources>
<Grid>
    <StackPanel>
        <Button Content="Add TabItem" Click="Button_Click_1"/>
        <TabControl ItemsSource="{Binding TabItems}" ContentTemplate="{StaticResource DataTemplate1}" MinHeight="100"></TabControl>

    </StackPanel>
</Grid>

MVVMに従っていませんが、これは私のコードビハインドです

public partial class MainWindow : Window
{
    private ObservableCollection<TabItemContainer> tabItems;


    public ObservableCollection<TabItemContainer> TabItems
    {
        get { return tabItems; }
        set
        {
            tabItems = value;
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        TabItems = new ObservableCollection<TabItemContainer>();
        TabItemContainer container = new TabItemContainer();
        TabItems.Add(container);

        DataTable table = container.Data;


        DataRow row = table.NewRow();
        row["Name"] = "ABC";
        row["Amount"] = 10;
        table.Rows.Add(row);
        container.Data = table;
        this.DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        TabItemContainer container = ((Button)sender).DataContext as TabItemContainer;
        DataRow row = container.Data.NewRow();
        row["Name"] = "ABC";
        row["Amount"] = 10;
        container.Data.Rows.Add(row);
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        TabItems.Add(new TabItemContainer());
    }


}

public class TabItemContainer
{
    private DataTable data;

    public DataTable Data
    {
        get
        {
            if (data == null)
            {
                data = new DataTable();
                data.Columns.Add("Name", typeof(string));
                data.Columns.Add("Amount", typeof(int));
            }
            return data;
        }
        set
        {
            data = value;
        }
    }
}
于 2013-08-27T06:32:23.853 に答える