29

これが私のバインディング ソース オブジェクトです。

Public Class MyListObject

    Private _mylist As New ObservableCollection(Of String)
    Private _selectedName As String

    Public Sub New(ByVal nameList As List(Of String), ByVal defaultName As String)

        For Each name In nameList
            _mylist.Add(name)
        Next

        _selectedName = defaultName

    End Sub

    Public ReadOnly Property MyList() As ObservableCollection(Of String)
        Get
            Return _mylist
        End Get
    End Property

    Public ReadOnly Property SelectedName() As String
        Get
            Return _selectedName
        End Get
    End Property

End Class

ここに私のXAMLがあります:

<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    xmlns:local="clr-namespace:WpfApplication1"
        >

    <Window.Resources>
        <ObjectDataProvider x:Key="MyListObject" ObjectInstance="" />
    </Window.Resources>

        <Grid>

        <ComboBox Height="23"
                  Margin="24,91,53,0"
                  Name="ComboBox1"
                  VerticalAlignment="Top"
                  SelectedValue="{Binding Path=SelectedName, Source={StaticResource MyListObject}, Mode=OneWay}"
                  ItemsSource="{Binding Path=MyList, Source={StaticResource MyListObject}, Mode=OneWay}"
                  />

        <Button Height="23"
                HorizontalAlignment="Left"
                Margin="47,0,0,87"
                Name="btn_List1"
                VerticalAlignment="Bottom"
                Width="75">List 1</Button>

        <Button Height="23"
                Margin="0,0,75,87"
                Name="btn_List2"
                VerticalAlignment="Bottom"
                HorizontalAlignment="Right"
                Width="75">List 2</Button>
    </Grid>
</Window>

コードビハインドは次のとおりです。

Class Window1

    Private obj1 As MyListObject
    Private obj2 As MyListObject
    Private odp As ObjectDataProvider

    Public Sub New()

        InitializeComponent()

        Dim namelist1 As New List(Of String)
        namelist1.Add("Joe")
        namelist1.Add("Steve")
        obj1 = New MyListObject(namelist1, "Steve")
.
        Dim namelist2 As New List(Of String)
        namelist2.Add("Bob")
        namelist2.Add("Tim")
        obj2 = New MyListObject(namelist2, "Tim")

        odp = DirectCast(Me.FindResource("MyListObject"), ObjectDataProvider)
        odp.ObjectInstance = obj1

    End Sub

    Private Sub btn_List1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_List1.Click

        odp.ObjectInstance = obj1

    End Sub

    Private Sub btn_List2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_List2.Click

        odp.ObjectInstance = obj2

    End Sub
End Class

Window が最初に読み込まれると、バインディングは正常に接続されます。ComboBox には「Joe」と「Steve」という名前が含まれており、デフォルトでは「Steve」が選択されています。ただし、ボタンをクリックして ObjectInstance を obj2 に切り替えると、ドロップダウンに ComboBox ItemsSource が正しく入力されますが、SelectedValue は obj2.SelectedName と等しくなるのではなく、Nothing に設定されます。

4

12 に答える 12

37

先週も同様の問題が発生しました。それは、SelectedValueその内部を更新する方法と関係があります。私たちが見つけたのは、設定した場合SelectedValue、代わりに設定しなければならなかった変更が表示されず、SelectedItemすべてが適切に更新されるということでした。私の結論はSelectedValueget操作用に設計されており、setではないということです。ただし、これは3.5sp1.netの現在のバージョンのバグである可能性があります。

于 2008-10-29T16:31:07.890 に答える
17

2 年前の会話を盛り上げるには:

文字列を使用する場合は、コンボボックスの Text プロパティにバインドすることもできます。

<ComboBox Text="{Binding Test}">
     <ComboBoxItem Content="A" />
     <ComboBoxItem Content="B" />
     <ComboBoxItem Content="C" />
</ComboBox>

それは次のようなものにバインドされています:

public class TestCode
{
    private string _test;
    public string Test 
    { 
      get { return _test; }
      set
      {
         _test = value;
         NotifyPropertyChanged(() => Test); // NotifyPropertyChanged("Test"); if not using Caliburn
      }
    }
}

上記のコードは双方向なので、Test="B"; を設定すると、コードでは、コンボボックスに「B」が表示され、ドロップダウンから「A」を選択すると、バインドされたプロパティに変更が反映されます。

于 2010-07-21T16:03:49.113 に答える
10

使用する

UpdateSourceTrigger=PropertyChanged 

バインディングで

于 2012-05-10T07:10:40.683 に答える
6

問題:

ComboBox クラスは、IndexOf メソッドを使用して、指定されたオブジェクトを検索します。このメソッドは、Equals メソッドを使用して等しいかどうかを判断します。

解決:

したがって、次のように、Converter を介して SelectedValue を使用して SelectedIndex を設定してみてください。

C# コード

//Converter

public class SelectedToIndexConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && value is YourType)
            {
                YourType YourSelectedValue = (YourType) value;

                YourSelectedValue = (YourType) cmbDowntimeDictionary.Tag;
                YourType a = (from dd in Helper.YourType
                                        where dd.YourTypePrimaryKey == YourSelectedValue.YourTypePrimaryKey
                                        select dd).First();

                int index = YourTypeCollection.IndexOf(a); //YourTypeCollection - Same as ItemsSource of ComboBox
            }
            return null;
        }
         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value!=null && value is int)
            {
                return YourTypeCollection[(int) value];
            }

            return null;
        }
    }

Xaml

<ComboBox 
   ItemsSource="{Binding Source={StaticResource YourDataProvider}}"
   SelectedIndex="{Binding Path=YourValue, Mode=TwoWay, Converter={StaticResource SelectedToIndexConverter}, UpdateSourceTrigger=PropertyChanged}"/>

幸運を!:)

于 2011-05-13T03:02:50.460 に答える
5

とのタイプは完全に同じSelectedValuePathであるSelectedValue必要があります。

たとえば、SelectedValuePathisInt16のタイプとにバインドするプロパティのタイプがSelectedValueisの場合、intそれは機能しません。

私はそれを見つけるために何時間も費やします、そしてそれが私が質問がされたのに多くの時間を費やした後にここで答えている理由です。たぶん、同じ問題を抱えている私のような別の貧しい人がそれを見ることができます。

于 2011-04-21T10:26:15.017 に答える
3

似たようなものに出くわし、最後にドロップダウンのSelectionChangedイベントをサブスクライブして、データプロパティを設定しました。愚かで、それが必要でなかったらいいのに、それはうまくいきました。

于 2009-08-06T20:42:06.643 に答える
2

SelectedValuePath="Content"をコンボボックスの xaml に設定しSelectedValueてからバインディングとして使用するのは合理的ですか?

文字列のリストがあり、バインディングでコンボボックス内の実際の項目のコンテンツに対して文字列の照合を行いたいようです。そのため、どのプロパティを使用するかを指定すると機能しSelectedValueます。少なくとも、この問題に遭遇したときはうまくいきました。

Content は賢明なデフォルトのように思えますSelectedValueが、そうではないのでしょうか?

于 2009-08-11T20:38:23.817 に答える
1

OnPropertyChanged("SelectedName") など、SelectName が更新されたことを知らせるイベントを発生させてみましたか? それは私のために働いた。

于 2012-02-06T20:56:04.847 に答える
0

これを解決しました。は!!![いずれか...] を使用します。.SelectedItem | .SelectedText ヒント: Selected Value は ComboStyle.DropDownList に適していますが、.SelectedText は ComboStyle.DropDown に適しています。

-これで問題が解決するはずです。この小さな fyn を解決するのに 1 週​​間以上かかりました。ハッ!!

于 2015-12-14T18:51:26.517 に答える
0

今日は何時間もこの問題と戦ってきました。それはDataTypeの問題でした!ComboBox に入力されていたリストは Int64 で、その値を Int32 フィールドに格納しようとしていました! エラーはスローされませんでした。値が格納されていませんでした。

于 2010-03-23T20:54:41.910 に答える
0

ソースが更新対象であるため、Binding Mode は OneWayToSource または TwoWay である必要があります。モード OneWay は Source to Target であるため、Source が ReadOnly になり、Source が更新されません。

于 2010-03-09T00:34:57.227 に答える