-1

クラス SInstance のプロパティ LogicalP にバインドされた wpf コンボボックスがあります。コンボボックスの ItemSource は、LogicalP 型のアイテムを含むディクショナリです。

SInstance の LogicalP を初期状態に設定すると、コンボ ボックスのテキスト フィールドに何も表示されません。プルダウンを選択すると、辞書の値がすべて表示されます。選択を変更すると、SInstance の LogicalP が正しく更新されます。C# で Sinstance を変更すると、プルダウンから更新された LogicalP が適切なコンボボックスの値に反映されません。

バインディングモードを双方向に設定しましたが、うまくいきませんでした。何かご意見は?

私の Xaml:

<UserControl.Resources>
<ObjectDataProvider x:Key="PList"
                    ObjectType="{x:Type src:MainWindow}"
                    MethodName="GetLogPList"/>
</UserControl.Resources>

<DataTemplate DataType="{x:Type src:SInstance}">
<Grid>
    <ComboBox ItemsSource="{Binding Source={StaticResource PList}}"
              DisplayMemberPath ="Value.Name" 
              SelectedValuePath="Value"
            SelectedValue="{Binding Path=LogicalP,Mode=TwoWay}">
    </ComboBox>
</Grid>
</DataTemplate>

私のC#:

public Dictionary<string, LogicalPType> LogPList { get; private set; }
public Dictionary<string, LogicalPType> GetLogPList()
{
    return LogPList;
}

public class LogicalPType
{
    public string Name { get; set; }
    public string C { get; set; }
    public string M { get; set; }
}                  

public class SInstance : INotifyPropertyChanged
{
    private LogicalPType _LogicalP;

    public string Name { get; set; }
    public LogicalPType LogicalP
    {
        get { return _LogicalP; }
        set
        {
            if (_LogicalP != value)
            {
                _LogicalP = value;
                NotifyPropertyChanged("LogicalP");
            }
        }
    }

    #region INotifyPropertyChanged Members
    #endregion
}    
4

2 に答える 2

0

これが私の実用的なソリューションです。ディクショナリ検索 GetLogPList を、データを提供するクラスと同じクラスに移動することで (Blam の提案に従って)、バインドを両方の方法で機能させることができました。コンボボックスを簡素化するために、バインディングを辞書ではなくリストに変更しました

新しい ItemsSource バインディングと SelectedValuePath の削除を示す更新された Xaml を次に示します。

<DataTemplate DataType="{x:Type src:SInstance}">
    <Grid>
        <ComboBox ItemsSource="{Binding GetLogPList}"
                  DisplayMemberPath ="Name" 
                SelectedValue="{Binding Path=LogicalP,Mode=TwoWay}">
        </ComboBox>
    </Grid>
</DataTemplate>

次に、辞書 LogPList を静的に変更して、クラス SInstance にアクセスできるようにしました。

    public static Dictionary<string, LogicalPType> LogPList { get; private set; }

最後に、GetLogPList をプロパティとしてクラス SInstance に移動しました。Xaml をもう少し単純にするために、辞書ではなくリストを返すことに注意してください。

public class SInstance : INotifyPropertyChanged
{
    public List<LogicalPType> GetLogPList
    {
        get { return MainWindow.LogPList.Values.ToList(); }
        set { }
    }   

    private LogicalPType _LogicalP;

    public string Name { get; set; }
    public LogicalPType LogicalP
    {
        get { return _LogicalP; }
        set
        {
            if (_LogicalP != value)
            {
                _LogicalP = value;
                NotifyPropertyChanged("LogicalP");
            }
        }
    }

    #region INotifyPropertyChanged Members
    #endregion
} 
于 2013-06-05T17:20:28.563 に答える
0

彼らは同じ情報源を見ているわけではありません。
SInstance に LogPList と LogicalP の両方を提供させる必要があります。

_LogicalP は LogPList に接続されていません

異なるオブジェクトを比較して同等にしたい場合は、Equals をオーバーライドする必要があります。

于 2013-06-04T18:29:35.300 に答える