WPF:更改DataTemplate的一项更改 [英] WPF: Change DataTemplate for one change

查看:131
本文介绍了WPF:更改DataTemplate的一项更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Wpf应用程序中,我有两个数据模板。 DefaultDataTemplate和EditableDataTemplate。

In my Wpf application, I've two datatemplates. DefaultDataTemplate and EditableDataTemplate.

Xaml:

<DataTemplate x:Key="DefaultDataTemplate" >
            <StackPanel Orientation="Horizontal" Width="596">
                <TextBlock Text="{Binding ClientNameBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="145"/>
                <TextBlock Text="{Binding ApplicationNameBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="90"/>
                <TextBlock Text="{Binding StartTimeBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="100"/>
                <TextBlock Text="{Binding StopTimeBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="60"/>
                <TextBlock Text="{Binding TaskNameBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="71"/>
                <TextBlock Text="{Binding ProjectNameBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="130"/>  
            </StackPanel>
        </DataTemplate>


<DataTemplate x:Key="EditableDataTemplate">
            <StackPanel Orientation="Horizontal" Width="596">
                <!--<ComboBox x:Name="ClientComboBox" SelectionChanged="ClientComboBoxChanged" ItemsSource="{Binding Path=clientList, ElementName=MainWin}" SelectedValuePath="_id" DisplayMemberPath="_name" SelectedItem="{Binding ClientNameBindingClass, Mode=OneWayToSource}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="145"/>-->
                <TextBox Text="{Binding ClientNameBinding,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="145"/>
                <TextBox Text="{Binding ApplicationNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="90"/>
                <xctk:TimePicker Name="StartPicker" Value="{Binding StartValue, ElementName=MainWin, UpdateSourceTrigger=PropertyChanged}" Format="Custom" FormatString="hh:mm tt" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="100" EndTime="11:59:0"/>
                <xctk:TimePicker Name="EndPicker" Value="{Binding EndValue, ElementName=MainWin, UpdateSourceTrigger=PropertyChanged}" Format="Custom" FormatString="hh:mm tt" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="60" EndTime="11:59:0"/>
                <TextBox Text="{Binding TaskNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="71"/>
                <ComboBox x:Name="ProjectComboBox" ItemsSource="{Binding Path=projectList, ElementName=MainWin}" SelectedValuePath="_id" DisplayMemberPath="_name"  SelectedItem="{Binding ProjectNameBindingClass, Mode=OneWayToSource}" Width="130" Background="Yellow" BorderThickness="0"/>
            </StackPanel>
        </DataTemplate>

在下面的代码中,我试图更改datatemplate,以便可以编辑现有的数据条目列表框。按照下面的代码,当我从DefaultDataTemplate移到EditableDataTemplate时,我可以编辑所有条目,因为所有条目都处于编辑模式。编辑完成后,当我再次单击按钮时,我只想发布已更改(其文本已更改/更新)的条目。但是问题是,在按钮上单击,所有条目都将发布到我链接到的Web帐户。

In the following code, I'm trying to change datatemplate so that I can edit existing data entries of the listbox. As per below code, when I move from DefaultDataTemplate to EditableDataTemplate, I can edit all the entries because all entries in edit mode. After editing is done when I click on button again,I just want to post that entry which I changed (whose text changed/ updated). But the problem is, on button click all the entries are getting posted to the web account to which I linked.

C#:

private void EditButton_Click(object sender, RoutedEventArgs e)
    {
        foreach (Harvest_TimeSheetEntry item in listBox1.Items)
        {
            if (item.isSynced)
            {
                item.isSynced = false;
                listBox1.ItemTemplate = (DataTemplate)this.FindResource("EditableDataTemplate");
                this.EditButton.Content = "Done Editing";
            }
            else
            {
                listBox1.ItemTemplate = (DataTemplate)this.FindResource("DefaultDataTemplate");
                this.EditButton.Content = "Edit";
                Globals._globalController.harvestManager.postHarvestEntry(item);
                System.Windows.MessageBox.Show("Entry posted");
            }
        }
    }

下面的行用于发布进入Web帐户-

Below line is used for posting entry to Web account-

Globals._globalController.harvestManager.postHarvestEntry(item);

请提出一些建议,我应该如何进行?

Please suggest something, how should I proceed?

推荐答案

您可以在类Harvest_TimeSheetEntry中添加一个属性 DirtyFlag,该属性指示至少一个值已更改。

You can add in the class Harvest_TimeSheetEntry a Property "DirtyFlag" that indicates that at least one value was changed.

public class Harvest_TimeSheetEntry
{
    public bool DirtyFlag {get; private set;}

    public void Reset()
    {
        DirtyFlag = false;
    }

    public DateTime StartValue
    {
        get { return _startValue; }
        set 
        {
            _startValue = value;
            // in each of the modifyable Properties add this
            DirtyFlag = true;
        }
    }

    (...)
}

在您的Button事件处理程序中,然后检查该标志:

In your Button Event Handler you check then for this Flag:

private void EditButton_Click(object sender, RoutedEventArgs e)
{
    foreach (Harvest_TimeSheetEntry item in listBox1.Items)
    {
        if (item.isSynced)
        {
            item.Reset();

            item.isSynced = false;
            listBox1.ItemTemplate = (DataTemplate)this.FindResource("EditableDataTemplate");
            this.EditButton.Content = "Done Editing";
        }
        else
        {
            listBox1.ItemTemplate = (DataTemplate)this.FindResource("DefaultDataTemplate");
            this.EditButton.Content = "Edit";
            if(item.DirtyFlag)
            {
                Globals._globalController.harvestManager.postHarvestEntry(item);
                item.Reset();
                System.Windows.MessageBox.Show("Entry posted");
            }
        }
    }
}

这篇关于WPF:更改DataTemplate的一项更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆