1

以下のViewModelのObservableCollectionにバインドされているデータグリッドがあります。Datagridはすべての値を正しく表示するため、バインディングは機能しているように見えますが、値を変更すると、グリッドはVMのセッターを呼び出しません。誰かが理由を教えてもらえますか?

これが私のViewModelです:

    public class DocumentVm : ViewModelBase
{
    private Document document;
    public bool IsNew { get; private set; }
    public Document Document {
        get { return document; }
    }

    public DocumentVm(Document document)
    {
        this.document = document;
        IsNew = false;
    }

    public DocumentVm(Document document, bool isNew)
    {
        this.document = document;
        IsNew = isNew;
    }

    public String Name 
    {
        get { return document.Name; }
        set { document.Name = value; RaisePropertyChangedEvent("Name");}
    }

    public String Path
    {
        get { return document.Path; }
        set { document.Path = value; }
    }

    public String Metadata
    {
        get { return document.Metadata; }
        set { document.Metadata = value; }
    }

    public int SpeechId
    {
        get { return document.SpeechId; }
        set { document.SpeechId = value; }
    }

}

XAMLコードは次のとおりです。

<DataGrid Margin="3" Grid.Row="7" Grid.Column="1" BorderThickness="0" 
      ItemsSource="{Binding Path=CurrentSpeech.Documents, Mode=TwoWay}" 
      SelectedItem="{Binding Path=CurrentSpeech.CurrentDocument, Mode=TwoWay}">
<DataGrid.Columns>
    <DataGridTemplateColumn Header="Name" Width="SizeToCells">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Name, Mode=TwoWay}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn Header="MetaDaten" Width="SizeToCells">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Metadata, Mode=TwoWay}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn Header="Pfad" Width="SizeToCells">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

皆さん、ありがとうございました!

4

2 に答える 2

1

バインディングのUpdateSourceTrigger=PropertyChangedがありませんでした。

于 2012-12-26T13:24:58.993 に答える
0

セッターが呼び出されない理由はわかりませんが、依存関係プロパティを使用すると、実際に呼び出されます。酔っ払ってCLRプロパティがプロジェクトに設定されない理由を調査することはできませんが、これは私にとってはうまくいきます。

public partial class MainWindow : Window
{        public ObservableCollection<DocumentVm> Items
    {
        get { return (ObservableCollection<DocumentVm>)GetValue(ItemsProperty); }
        set { SetValue(ItemsProperty, value); }
    }
    public static readonly DependencyProperty ItemsProperty =
        DependencyProperty.Register("Items", typeof(ObservableCollection<DocumentVm>), typeof(MainWindow), new PropertyMetadata(null));

    public MainWindow()
    {
        InitializeComponent();
        Items = new ObservableCollection<DocumentVm>();
        Items.Add(new DocumentVm() { Name = "Name 1"});
        Items.Add(new DocumentVm() { Name = "Name 2"});
    }
}

public class DocumentVm : DependencyObject
{
    public string Name
    {
        get { return (string)GetValue(NameProperty); }
        set { SetValue(NameProperty, value); }
    }
    public static readonly DependencyProperty NameProperty =
        DependencyProperty.Register("Name", typeof(string), typeof(DocumentVm), new PropertyMetadata(null, new PropertyChangedCallback( (s, e)=>
            {
                // This will run when the property is set.
            })));        
}
于 2012-12-26T01:05:40.130 に答える