0

xml ファイルからタスクにバインドされたデータ テンプレートを含むリスト ボックスがあり、ボタンのクリック時に選択したテンプレートを削除したいのですが、例外がスローされます。代わりに ItemsSource を使用してください。」

ここにxamlのコードがあります

 <TabItem>
        <Canvas Height="700" Width="850">
            <Canvas.Resources>
                <XmlDataProvider x:Key="Tasks" XPath="tasks"
       Source="http://store.tymesheet.com/templates/Graphic-Designer.xml"/>
                <DataTemplate x:Key="tasktemplate1">
                    <Canvas Height="50" Width="850" >
                        <Label Content="{Binding XPath=name}" Height="30"
                   Width="170" Canvas.Top="10" Canvas.Left="150" 
                   Background="LightGray"/>
                        <TextBox Height="30" Width="120" Canvas.Top="10"
                     Canvas.Left="370" Background="AliceBlue"/>
                        <Label  Canvas.Left="500" Canvas.Top="10">$</Label>
                        <Button Tag="{Binding}" Click="deletebuttonclick" 
                    Canvas.Top="12" Height="10" Width="30"
                    Canvas.Left="600"/>
                    </Canvas>
                </DataTemplate>
            </Canvas.Resources>
            <ListBox ItemTemplate="{StaticResource tasktemplate1}"
      ItemsSource="{Binding Path=ChildNodes, Source={StaticResource Tasks}}" 
      x:Name="tasklistbox" Height="700" Width="850"/>
            <Label Canvas.Top="-18" Canvas.Left="185">Select Task</Label>
            <Label Canvas.Top="-18" Canvas.Left="377" RenderTransformOrigin="0.58,0.462">Enter Bill Rates</Label>
            <Button Canvas.Left="39" Canvas.Top="575" Width="139">Click to add the task</Button>
        </Canvas>
    </TabItem>

ここに削除ボタンのコードビハインドがあります

 private void deletebuttonclick(object sender,RoutedEventArgs e)
    {
        tasklistbox.Items.Remove(tasklistbox.SelectedItem);    
    }

どこが間違っていますか?,help.thanx.

4

2 に答える 2

2

あなたが表示したエラーはかなり自明です:

使用中の操作は無効ですItemsSource。代わりに要素にアクセスして変更しItemsControl.ItemsSourceます。

明らかに、ご存知のように、ItemsSourceのプロパティを使用しましたListBox

<ListBox ItemTemplate="{StaticResource tasktemplate1}"
    ItemsSource="{Binding Path=ChildNodes, Source={StaticResource Tasks}}" 
    x:Name="tasklistbox" Height="700" Width="850" />

エラーは、代わりに要素にアクセスして変更するようItemsControl.ItemsSourceに指示しています。したがって、それが言うことをしない代わりに:

private void deletebuttonclick(object sender,RoutedEventArgs e)
{
    tasklistbox.Items.Remove(tasklistbox.SelectedItem);    
}

それが言うことを実際にやってみてください:

private void deletebuttonclick(object sender,RoutedEventArgs e)
{
    tasklistbox.ItemsSource = null; 
}

またはさらに良い:

private void deletebuttonclick(object sender,RoutedEventArgs e)
{
    ChildNodes = null; 
}

更新 >>>

そのため、あることを尋ねる別の新しいユーザーがいるようです。そのことが与えられたときに、「ありがとう」ほどではなく別のことを求めます...残念です...本当に残念です。

最初に、ListBox.SelectedItemどの項目が選択されているかを知るために、プロパティにデータをバインドする必要があります。

<ListBox ItemTemplate="{StaticResource tasktemplate1}" SelectedItem="{Binding Item}"
    ItemsSource="{Binding Path=ChildNodes, Source={StaticResource Tasks}}" 
    x:Name="tasklistbox" Height="700" Width="850" />

このItemプロパティは、コレクション内のアイテムと同じタイプである必要がありChildNodesます...十分に明確でない場合は、コレクションプロパティの隣にそのプロパティを追加する必要があります次に、ハンドラーでそのアイテムを削除するには、次のようにするだけです。

private void deletebuttonclick(object sender,RoutedEventArgs e)
{
    ChildNodes.Remove(Item);
}
于 2014-06-17T15:41:52.683 に答える
1

アイテムを削除する場合はObservableCollection、XmlNode を作成し、それに ItemsSource をバインドすることをお勧めします。ObservableCollection を使用することをお勧めしINotifyCollectionChangedます。これは、リストが更新されるたびにターゲットが実装されるためです。この場合、ListBox は自動的に更新されます。


コード ビハインド(使用するSystem.Collections.ObjectModel名前空間を 追加ObservableCollection<T>)

public MainWindow()
{
    InitializeComponent();

    XmlDocument doc = new XmlDocument();
    doc.Load("http://store.tymesheet.com/templates/Software-Developer.xml");
    var taskList = doc.ChildNodes.OfType<XmlNode>()
                    .Where(node => node.Name == "tasks")
                    .SelectMany(node => node.ChildNodes.OfType<XmlNode>());
    Tasks = new ObservableCollection<XmlNode>(taskList);

    this.DataContext = this;
}

public ObservableCollection<XmlNode> Tasks { get; set; }

private void deletebuttonclick(object sender, RoutedEventArgs e)
{
   XmlNode selectedNode = ((Button)sender).DataContext as XmlNode;
   Tasks.Remove(selectedNode);
}

もちろん、XAMLも更新する必要があります。

<ListBox ItemsSource="{Binding Tasks}"
         ItemTemplate="{StaticResource tasktemplate1}"
         x:Name="listBox" Height="700" Width="850"/>
于 2014-06-17T17:06:12.250 に答える