1

これら2の答えに続いて:

MVVM での WPF DataGridComboBoxColumn の使用 - ViewModel でのプロパティへのバインド

WPF DataGridComboBoxColumn を MVVM にバインドする

1) コンボボックスで選択が行われたときに、ObservableCollections の値を設定することができません。

コンボボックスには ViewModel からのリストが取り込まれていますが、値は設定されていません。

コード:

<DataGrid ItemsSource="{Binding SidValues1through5, Mode=TwoWay}"                                  
     AutoGenerateColumns="False"
     Grid.Row="1"   
     Margin="5"
     VerticalAlignment="Top"
     HorizontalAlignment="Center">
     <DataGrid.Columns>
           <DataGridComboBoxColumn Header="1"
                                   Width="100"
                                   SelectedValueBinding="{Binding Value1}"
                                   SelectedValuePath="Value1">
                                    <DataGridComboBoxColumn.ElementStyle>
                                        <Style TargetType="ComboBox">
                                            <Setter Property="ItemsSource"
                                                    Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.AvailableSids}" />
                                        </Style>
                                    </DataGridComboBoxColumn.ElementStyle>
                                    <DataGridComboBoxColumn.EditingElementStyle>
                                        <Style TargetType="ComboBox">
                                            <Setter Property="ItemsSource"
                                                    Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.AvailableSids}" />
                                        </Style>
                                    </DataGridComboBoxColumn.EditingElementStyle>
                                </DataGridComboBoxColumn>

ViewModel インターフェイス (デバッグして ViewModel に接続しています。ビューの他のコントロールは正しくバインドされています。

ETA: BindableCollection は、Caliburn.Micro タイプの ObservableCollection から継承します。

public interface ICustomSIDViewModel : IScreen
{
    BindableCollection<SidValues> SidValues1through5 { get; set; }
    BindableCollection<SidValues> SidValues6through10 { get; set; }

    IList<string> AvailableSids { get; }
}

public class SidValues
{
    public string Value1 { get; set; }
    public string Value2 { get; set; }
    public string Value3 { get; set; }
    public string Value4 { get; set; }
    public string Value5 { get; set; }
}

2)これを解決したら、すべての列にこの DataGridComboBoxColumn.ElementStyle と DataGridComboBoxColumn.EditingElementStyle のセットを継承させるよりクリーンな方法はありますか?

私が尋ねる理由は、すべて同じコンボボックスリストを持つ10列があるからです。

4

3 に答える 3

0

私が最終的に作業してプロジェクトを進めるために必要だったのは、GridView を内部に持つ ListView でした。全く同じではありませんが似ています。

DataGrid を実際に MVVM と Caliburn.Micro で動作させる方法にまだ興味があります。見つけたすべての例を試してみましたが、VM で何かを更新するためのコンボボックスの選択を取得できませんでした。

これが私の解決策です:

<ListView.View>
    <GridView>                                    
        <GridViewColumn Header="1"
                       Width="100">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding Path=DataContext.AvailableSids,
                                        RelativeSource={RelativeSource FindAncestor, 
                                        AncestorType={x:Type UserControl}}}"
                              SelectedItem="{Binding Path=Value1, Mode=TwoWay, 
                                              UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView>  
</ListView.View>
于 2012-08-11T18:44:10.000 に答える
0
SelectedValueBinding="{Binding SelectedValue, Mode=TwoWay}"
                                       SelectedValuePath="Value1">

private string selectedValue;
    public string SelectedValue 
    {
        get
        {
            return selectedValue;
        }
        set
        {
            selectedValue = value;
            Notify("SelectedValue");
        } 
    }

    private void Notify(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }

ComboBox の ItemsSource である Collection のプロパティの 1 つをバインドしています。それは間違っています。上記の SelectedValue として別のプロパティを持ち、このプロパティを ComboBox の SelectedValue にバインドする必要があります。このプロパティでは、 ComboBox の選択された値。これが役立つことを願っています。

于 2012-08-10T17:05:52.723 に答える
0

最初の質問について - これは WPF であるため、バインディングで Mode=TwoWay を使用する必要はありませんが、念のため、最初に試してみてください。

WPF afaik のデフォルトは TwoWay ですが、SL ではありません。とにかく試してみてください。

2 番目の質問については、リソース ディクショナリでネストされたスタイルを宣言するだけです。ネストされたスタイルは、ターゲット コントロールの子要素に適用されます

例えば

<Style x:Key="DataGridComboBoxStyle" TargetType="DataGrid">
    <!-- Nested -->
    <Style.Resources>
            <Style TargetType="ComboBox">
                <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.AvailableSids}" />
            </Style>
    </Style.Resources>
</Style>

コントロール全体にスタイルを適用し、このスタイルをそのスタイルにネストすることもできます:)

于 2012-08-10T17:07:05.453 に答える