1

私はこれを使用しています:私のコンボボックスのWPFデータバインディングで列挙型プロパティをコンボボックスにデータバインディングします。ただし、コンボボックスの値をプログラムで設定することはできません。一度バインドすると、SelectedItem、SelectedValue、または Text を設定できません。

これを行う方法があるはずですか?どんな助けでも大歓迎です。

明確にするために、50 個すべての状態を持つ列挙型にバインドされたコンボボックスがあります。コンボボックスがバインドされている列挙型と同じ型の状態値があります。コンボボックスの値を自分の状態の値に設定したいと思います。

4

2 に答える 2

0

ComboBox の SelectedItem を基になるクラスにバインドする場合、そのクラスを変更することでバインディングを変更できるはずです。

たとえば、列挙型の名前が「Country」で、「Person」というクラスがあり、その人に「CountryOfOrigin」というプロパティがあり、それを ComboBox にバインドしたいとします。あなたはこれを行うことができます:

XAML ファイル:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestingWPF"
    x:Class="TestingWPF.TestWindow">

    <Window.Resources>
        <ObjectDataProvider MethodName="GetValues"
        ObjectType="{x:Type local:Country}"
        x:Key="Countries">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:Country" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>

    <StackPanel>
        <ComboBox x:Name="comboBox"
              HorizontalAlignment="Center"
              VerticalAlignment="Center"
              Width="100" Margin="10"
              ItemsSource="{Binding Source={StaticResource Countries}}"
              SelectedItem="{Binding Path=CountryOfOrigin, Mode=TwoWay}"/>
        <Button HorizontalAlignment="Center" Content="Change Country to Mexico" Margin="10" Click="Button_Click"/>
    </StackPanel>
</Window>

分離コード:

public partial class TestWindow : Window
{
    Person p;

    public TestWindow()
    {
        InitializeComponent();

        p = new Person();
        p.CountryOfOrigin = Country.Canada;

        DataContext = p;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        p.CountryOfOrigin = Country.Mexico;
    }
}

public enum Country
{
    Canada,
    UnitedStates,
    Mexico,
    Brazil,
}

public class Person : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private Country _countryOfOrigin;

    public Country CountryOfOrigin
    {
        get
        {
            return _countryOfOrigin;
        }
        set
        {
            if (_countryOfOrigin != value)
            {
                _countryOfOrigin = value;

                PropertyChanged(this, new PropertyChangedEventArgs("CountryOfOrigin"));
            }
        }
    }
}
于 2012-05-31T21:33:09.930 に答える
0

この記事は、ComboBox にバインドする列挙型を操作する際に非常に役立ちます。また、属性値を使用して列挙型を表示するための変換を整理する方法の例もあります。
そのため、ユーザーは Greater という名前の列挙型の代わりに fe ">" 記号を見ることができます

于 2012-06-01T20:35:42.507 に答える