3

重複の可能性:
List<string> にバインドされているときに ListBox を編集可能にする方法は?

「ListStr」オブジェクトという名前のリストと ListBox WPF コントロールの間に 2 つのバインディングを設定しようとしています。さらに、アイテムを編集可能にしたいので、TextBoxes を介して ListStr アイテムをすぐに変更することを期待して、TextBoxes を含む DataTemplate を追加しました。

しかし、そのうちの1つを編集しようとすると、うまくいきません...

何か案が ?

PS: Mode=TwoWay パラメータを追加しようとしましたが、まだ機能していません

XAML は次のとおりです。

<ListBox ItemsSource="{Binding Path=ListStr}" Style="{DynamicResource ResourceKey=stlItemTextContentListBoxEdit}" />

スタイルコードは次のとおりです。

<Style x:Key="stlItemTextContentListBoxEdit" TargetType="{x:Type ListBox}">
<Setter Property="Background" Value="#FF0F2592" />
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Height" Value="150" />
<Setter Property="Width" Value="200" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="ItemTemplate" Value="{DynamicResource ResourceKey=dtplItemTextContentListBoxEdit}" /></Style>

そしてDataTemplate:

<DataTemplate x:Key="dtplItemTextContentListBoxEdit">
    <TextBox Text="{Binding Path=.}" Width="175" />
</DataTemplate>
4

2 に答える 2

8

を使用すると、双方向バインディングは機能しません{Binding Path=.}(これは長いです{Binding})。何が起こっているかを覚えておいてください。

にはオブジェクトのListBoxリストが与えられ、ListBoxItemアイテムごとに 1 つ作成されます。のDataContextListBoxItemそのオブジェクトに設定されます。を使用するときは{Binding}、 内のオブジェクトをそのまま使用するように言っていますDataContext。TextBox に入力すると、何が更新されますか? DataContext を設定できず、オブジェクトがどこから来たのかわかりません (そのため、リスト/配列を更新できません)。

双方向バインディングが機能するのは、そのオブジェクトのプロパティにバインドするときです。ただし、オブジェクト自体にバインドする場合はそうではありません。

于 2012-12-19T14:08:39.713 に答える
3
    public class ViewModel
{
    ObservableCollection<TextItem> _listStr = new ObservableCollection<TextItem> { new TextItem("a"), new TextItem("b"), new TextItem("c") };

    public ObservableCollection<TextItem> ListStr
    {
        get  { return _listStr; }  // Add observable and propertyChanged here also if needed
    }
}

public class TextItem : NotificationObject // (NotificationObject from Prism you can just implement INotifyPropertyChanged)
{
    public TextItem(string text)
    {
        Text = text;
    }

    private string _text;
    public string Text
    {
        get { return _text; }
        set
        {
            if (_text != value)
            {
                _text = value;
                RaisePropertyChanged(() => Text);
            }
        }
    }
}


xaml:

 <DataTemplate>
    <TextBox Text="{Binding Text}" Width="175" />
 </DataTemplate>
于 2012-12-19T15:11:55.367 に答える