2

私の WPF C# プロジェクトには、次のような Datagrid があります。

<DataGrid x:Name="FixedPositionDataGrid" HorizontalAlignment="Left" Margin="33,229,0,0" VerticalAlignment="Top" Width="172" Height="128" AutoGenerateColumns="False" FontSize="10" CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="indice" Binding="{Binding index}" IsReadOnly="True"/>
            <DataGridTextColumn Header="%" Binding="{Binding percentage}" />                                    
            <DataGridComboBoxColumn x:Name="DataGridComboBoxColumnAlignment" Header="Allineamento barre" SelectedValueBinding="{Binding alignment}"/>
        </DataGrid.Columns>
    </DataGrid>

2 列目と 3 列目 (つまり、"%" と "Allineamento barre") の値の変化を管理するイベントが必要です。値を挿入する必要はありません。値の 1 つが変更されたときにイベントを発生させるだけです。どうすればそれを実行できますか? 実行する操作を定義できるイベント メソッドを定義する方法が必要です。MVVMを使用してwpfデータグリッドのセルの値が変更されたときにイベントを発生させる方法を読んだことがありますか? しかし、データグリッドにリンクされた監視可能なコレクションがありません。

編集: Datagrid ItemSource は、次のオブジェクトにリンクされています。

public class FixedPosition
{
    [XmlAttribute]
    public int index { get; set; }

    public int percentage { get; set; }
    public HorizontalAlignment alignment { get; set; }        
}

期待される結果を得るためにどのように変更できますか?

ありがとう

4

1 に答える 1

4

この問題を WinForms の観点から見ているようです。WPF では、通常、UI オブジェクトよりもデータ オブジェクトを操作することを好みます。アイテムには がないとおっしゃっていましたObservableCollection<T>が、使用することをお勧めします。

データのデータ型クラスがない場合は、作成することをお勧めします。INotifyPropertyChanged次に、その中にインターフェースを実装する必要があります。

これを実行し、コレクション プロパティを の として設定した後ItemsSourceは、選択したデータ型にハンドラーをDataGridアタッチするだけです。INotifyPropertyChanged

ビューモデルでは:

public ObservableCollection<YourDataType> Items
{
    get { return items; }
    set { items = value; NotifyPropertyChanged("Items"); }
}

public YourDataType SelectedItem
{
    get { return selectedItem; }
    set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); }
}

ビュー モデル コンストラクターで:

SelectedItem.PropertyChanged += SelectedItem_PropertyChanged;

ビューモデルでは:

private void SelectedItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    // this will be called when any property value of the SelectedItem object changes
    if (e.PropertyName == "YourPropertyName") DoSomethingHere();
    else if (e.PropertyName == "OtherPropertyName") DoSomethingElse();
}

UI で:

<DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" ... />
于 2013-09-10T14:57:40.587 に答える