2

私の wpf アプリケーションには、ListBox がある View クラスがあります。ListBox Item.so のダブルクリック イベントのコードを書いたので、任意のリスト ボックス アイテムをダブルクリックすると、そのアイテムが Harvest アカウントに投稿されます。イベントは次のとおりです。

private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        //Submit clicked Entry
        try
        {
            ListBoxItem item = (ListBoxItem)sender;
            Harvest_TimeSheetEntry entryToPost = (Harvest_TimeSheetEntry)item.DataContext;

            if (!entryToPost.isSynced)
            {
                //Check if something is selected in selectedProjectItem For that item
                if (entryToPost.ProjectNameBinding == "Select Project" && entryToPost.ClientNameBinding == "Select Client")
                    MessageBox.Show("Please select you Project and Client");
                else
                    Globals._globalController.harvestManager.postHarvestEntry(entryToPost);
                    MessageBox.Show("Entry posted");
            }
            else
            {

                //Already synced.. Make a noise or something
                MessageBox.Show("Already Synced;TODO Play a Sound Instead");
            }

        }
        catch (Exception)
        { }
     }

私のxamlコード:

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

        <!-- Editable DataTemplate -->
        <DataTemplate x:Key="EditableDataTemplate">
                <StackPanel Orientation="Horizontal" Width="596">
                <ComboBox x:Name="ClientComboBox" SelectionChanged="ProjectComboBoxChanged" 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 ApplicationNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="90"/>
                <TextBox Text="{Binding StartTimeBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="100"/>
                <TextBox Text="{Binding StopTimeBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="60"/>
                <TextBox Text="{Binding TaskNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="130"/>
                <ComboBox x:Name="ProjectComboBox" SelectionChanged="ProjectComboBoxChanged" ItemsSource="{Binding Path=projectList, ElementName=MainWin}" SelectedValuePath="_id" DisplayMemberPath="_name"  SelectedItem="{Binding ProjectNameBindingClass, Mode=OneWayToSource}" Width="71" Background="Yellow" BorderThickness="0"/>
            </StackPanel>
        </DataTemplate>




        <!-- DataTemplate Selector -->

        <l:DayViewListDataTemplateSelector x:Key="templateSelector"
          DefaultDataTemplate="{StaticResource DefaultDataTemplate}"
          EditableDataTemplate="{StaticResource EditableDataTemplate}"/>

私のクラスには、2 つのコンボボックスでその EditableDataTemplate を生成するタイマーがあります。私の問題は、ComboBoxes で Client と Project を選択してエントリをダブルクリックすると、アカウントに投稿されますが、その時点で editableDataTemplate から DefaultDataTemplate に変換したい (つまり、これらの 2 つのコンボボックスは DefaultDataTemplate で同様にテキスト ボックスになる必要があります)。この結果を達成するにはどうすればよいですか?

4

1 に答える 1

0

DataTemplateSelector は、要求に応じてデータ テンプレートを変更する方法を提供しているとは思いません。これは、さまざまな種類のデータ (データ状態ではなく) に対してさまざまなテンプレートを選択するために使用されるだけです。おそらく最善の方法は、データ モデルにプロパティを追加することだと思います。それを IsInEditMode と呼びましょう。次に、TextBlock と Combobox の両方をデータ テンプレートに追加し、IsInEditMode の値に従ってそれらの可視性を切り替えることができます。

ところで、DoubleClick イベント ハンドラで ListBox.SelectedItem プロパティを使用すると、最初に ListBoxItem を取得してからそのデータ コンテキストにアクセスしなくても、データ モデル要素に直接アクセスできます。

private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    //Submit clicked Entry
    try
    {
        if(listBox1.SelectedItem is Harvest_TimeSheetEntry)
        {
            Harvest_TimeSheetEntry entryToPost = (Harvest_TimeSheetEntry)listBox1.SelectedItem;

            if (!entryToPost.isSynced)
            {
                //Check if something is selected in selectedProjectItem For that item
                if (entryToPost.ProjectNameBinding == "Select Project" && entryToPost.ClientNameBinding == "Select Client")
                    MessageBox.Show("Please select you Project and Client");
                else
                    Globals._globalController.harvestManager.postHarvestEntry(entryToPost);
                    MessageBox.Show("Entry posted");

                    entryToPost.IsInEditMode = true; //set edit mode!
            }
        }
        else
        {

            //Already synced.. Make a noise or something
            MessageBox.Show("Already Synced;TODO Play a Sound Instead");
        }

    }
    catch (Exception)
    { }
 }
于 2013-07-01T16:06:23.613 に答える