0

私はいくつかの困難を抱えてwpfを解決しようとしています。これComboBoxは非常に基本的な問題のようですが、考えられる同様の投稿をすべて読んだ後でも、入力することはできません。

私が思う追加の難しComboBoxさは、 がリソースで定義されていることです。リソース コードは次のとおりです。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:s="clr-namespace:DiagramDesigner">

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Styles/Shared.xaml"/>
    <ResourceDictionary Source="Styles/ToolBar.xaml"/>
</ResourceDictionary.MergedDictionaries>

<ToolBar x:Key="MyToolbar" Height="120">

    <!--Languages-->
    <GroupBox Header="Localization" Style="{StaticResource ToolbarGroup}" Margin="3">
        <Grid>
            <ComboBox Height="23" HorizontalAlignment="Center" 
                      VerticalAlignment="Top"  Width="120"
                      ItemsSource="{Binding _langListString}" 
                        DisplayMemberPath="ValueString" 
                        SelectedValuePath="ValueString" 
                        SelectedValue="{Binding LangString}"
                      />
        </Grid>
    </GroupBox>

  </ToolBar>

私のデータオブジェクトは次のように定義されています:

public partial class Window1 : Window
{

    List<ComboBoxItemString> _langListString = new List<ComboBoxItemString>();

    // Object to bind the combobox selections to.
    private ViewModelString _viewModelString = new ViewModelString();


    public Window1()
    {
        // Localization settings
        _langListString.Add(new ComboBoxItemString()); _langListString[0].ValueString = "en-GB";
        _langListString.Add(new ComboBoxItemString()); _langListString[1].ValueString = "fr-FR";
        _langListString.Add(new ComboBoxItemString()); _langListString[2].ValueString = "en-US";


        // Set the data context for this window.
        DataContext = _viewModelString;


        InitializeComponent();


    }

そしてモデルビュー:

/// This class provides us with an object to fill a ComboBox with
/// that can be bound to string fields in the binding object.
public class ComboBoxItemString
{
    public string ValueString { get; set; }
}


//______________________________________________________________________
//______________________________________________________________________
//______________________________________________________________________



/// Class used to bind the combobox selections to. Must implement 
/// INotifyPropertyChanged in order to get the data binding to 
/// work correctly.
public class ViewModelString : INotifyPropertyChanged
{
    /// Need a void constructor in order to use as an object element 
    /// in the XAML.
    public ViewModelString()
    {
    }

    private string _langString = "en-GB";

    /// String property used in binding examples.
    public string LangString
    {
        get { return _langString; }
        set
        {
            if (_langString != value)
            {
                _langString = value;
                NotifyPropertyChanged("LangString");
            }
        }
    }

    #region INotifyPropertyChanged Members

    /// Need to implement this interface in order to get data binding
    /// to work properly.
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

他に何を試すべきかわかりません。何が起こっているのか、コンボボックスが空のままである理由を知っている人はいますか?

どうもありがとう。

4

2 に答える 2

0

私の分析では、問題は DataContext にあります。

DataContext = _viewModelString;

viewModelString を DataContext に渡す場合、コンボボックスがどの項目にバインドされているかを知るために、そこで _langListString を定義する必要があります。

これは私がすることです:

  1. リストを追加 _langListString = new List(); >ModelView に移動します。
  2. _langListString は _viewModelString._langListString.add(Your Items) になります - _viewModelString オブジェクトを作成するときは、_langList のインスタンス化に注意してください。

その後、残りはうまくいくと思います。


どうもありがとう、あなたが提案した変更がありますが、このコンボボックスはまだ空のままです:-(

新しいモデルビューは次のようになります。

/// Class used to bind the combobox selections to. Must implement 
/// INotifyPropertyChanged in order to get the data binding to 
/// work correctly.
public class ViewModelString : INotifyPropertyChanged
{
    public List<ComboBoxItemString> _langListString {get;set;}
    /// Need a void constructor in order to use as an object element 
    /// in the XAML.
    public ViewModelString()
    {
        // Localization settings
        _langListString = new List<ComboBoxItemString>();
        ComboBoxItemString c;
        c = new ComboBoxItemString(); c.ValueString = "en-GB"; _langListString.Add(c);
        c = new ComboBoxItemString(); c.ValueString = "fr-FR"; _langListString.Add(c);
        c = new ComboBoxItemString(); c.ValueString = "en-US"; _langListString.Add(c); 
    }

    private string _langString = "en-GB";

    /// String property used in binding examples.
    public string LangString
    {
        get { return _langString; }
        set
        {
            if (_langString != value)
            {
                _langString = value;
                NotifyPropertyChanged("LangString");
            }
        }
    }

    #region INotifyPropertyChanged Members

    /// Need to implement this interface in order to get data binding
    /// to work properly.
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

データ オブジェクト:

  // Object to bind the combobox selections to.
    private ViewModelString _viewModelString;

    public Window1()
    {
        // Set the data context for this window.
        _viewModelString = new ViewModelString();
        DataContext = _viewModelString;

        InitializeComponent();
    }

そして、コンボボックス(_langListString、_viewModelString._langListString、_viewModelString)で可能なすべての組み合わせを試しましたが、うまくいきません:

<ComboBox Height="23" HorizontalAlignment="Center" 
                      VerticalAlignment="Top"  Width="120"
                      ItemsSource="{Binding _langListString}" 
                        DisplayMemberPath="ValueString" 
                        SelectedValuePath="ValueString" 
                        SelectedValue="{Binding LangString}"
                      />

私は、この xaml がデバッグの可能性なしに物事を非常に複雑にしていると考える傾向があります。誰か助けてくれませんか???

于 2013-05-21T15:30:11.387 に答える
0

パブリックプロパティにバインドするだけです

 ItemsSource="{Binding _langListString}"

_langListString はパブリック プロパティではないため、機能しません

于 2013-05-21T14:09:43.457 に答える