1

私はWPFとMVVMライトフレームワークを使用しています(そして私はそれらを使用するのが初めてです)

状況は次のとおりです。

  • (データベースからロードされた) アイテムのリストを表示するコンボボックスがあり、コンボボックスにアイテムのタイトルを表示するために DisplayMemberPath を使用しています。

  • 同じ GUI で、ユーザーはテキスト ボックスで項目のタイトルを変更できます。「保存」ボタンを使用すると、ユーザーはデータをデータベースに保存できます。

私がやりたいのは、ユーザーが「保存」をクリックすると、コンボボックスのアイテムのタイトルも更新され、その時点で新しい値が表示されることです。しかし、私はそれを行う方法がわかりません...

私の実装に関するいくつかの詳細:

MainWindow.xaml

<ComboBox ItemsSource="{Binding SourceData}" SelectedItem="{Binding SelectedSourceData,Mode=TwoWay}" DisplayMemberPath="Title" />
<TextBlock Text="{Binding SelectedDataInTextFormat}"/>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Closing += (s, e) => ViewModelLocator.Cleanup();
    }
}

MainViewModel.xaml

public class MainViewModel:ViewModelBase
{
  public ObservableCollection<Foo> SourceData{get;set;}
  public Foo SelectedSourceData 
  { 
    get{return _selectedFoo;}
    set{_selectedFoo=value; RaisePropertyChanged("SelectedSourceData"); }
  }

  public string SelectedDataInTextFormat
  {
    get{return _selectedDataInTextFormat;}
    set{_selectedDataInTextFormat=value; RaisePropertyChanged("SelectedDataInTextFormat");
  }
}

誰かがこれについて私を助けてくれれば幸いです。

ご協力いただきありがとうございます。

ロマン

4

3 に答える 3

1

変更SelectedSourceData時にプロパティを更新するだけです。SelectedDataInTextFormat

public string SelectedDataInTextFormat
{
    get { return _selectedDataInTextFormat; }
    set
    {
        _selectedDataInTextFormat = value;
        RaisePropertyChanged("SelectedDataInTextFormat");

        SelectedSourceData = SourceData.FirstOrDefault(f => f.Title == _selectedDataInTextFormat)
    }
}

Title編集: ComboBox で現在選択されている項目のプロパティを変更するには、Foo クラスにINotifyPropertyChangedFooを実装できます。

public class Foo : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string title = string.Empty;
    public string Title
    {
        get { return title; }
        set
        {
            title = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Title"));
            }
        }
    }
}

次にTitle、選択した項目のプロパティを設定するだけです。

SelectedSourceData.Title = SelectedDataInTextFormat;
于 2013-01-21T11:45:57.060 に答える
0

コード:

public ObservableCollection<Foo> SourceData{get;set;}
public Foo SelectedSourceData 
{
    get{
        return _selectedFoo;
    }
    set{
        _selectedFoo=value;
        RaisePropertyChanged("SelectedSourceData");
    }
}

public string SelectedDataInTextFormat //Bind the text to the SelectedItem title
{
    get{
        return SelectedSourceData.Title
    }
    set{
        SelectedSourceData.Title=value;
        RaisePropertyChanged("SelectedDataInTextFormat");
    }
}

XAML:

<ComboBox ItemsSource="{Binding SourceData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    SelectedItem="{Binding SelectedSourceData,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Title" />
<TextBlock Text="{Binding SelectedDataInTextFormat, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
于 2013-01-22T15:44:01.777 に答える
0

これを行うには多くの方法があります. この例ではButton Tagプロパティを利用して保存ボタンハンドラ(またはICommand) にデータを送信します. を設定しTextBox UpdateSourceTriggerて,がクリックさExplicitれたときに更新を呼び出します.Button

例:

Xaml:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="105" Width="156" Name="UI">
    <Grid DataContext="{Binding ElementName=UI}">
        <StackPanel Name="stackPanel1">
            <ComboBox x:Name="combo" ItemsSource="{Binding SourceData}" DisplayMemberPath="Title" SelectedIndex="0"/>
            <TextBox x:Name="txtbox" Text="{Binding ElementName=combo, Path=SelectedItem.Title, UpdateSourceTrigger=Explicit}"/>
            <Button Content="Save" Tag="{Binding ElementName=txtbox}" Click="Button_Click"/>
        </StackPanel>
    </Grid>
</Window>

コード:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private ObservableCollection<Foo> _sourceData = new ObservableCollection<Foo>();

    public MainWindow()
    {
        InitializeComponent();
        SourceData.Add(new Foo { Title = "Stack" });
        SourceData.Add(new Foo { Title = "Overflow" });
    }

    public ObservableCollection<Foo> SourceData
    {
        get { return _sourceData; }
        set { _sourceData = value; }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var txtbx = (sender as Button).Tag as TextBox;
        txtbx.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }


    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}


public class Foo : INotifyPropertyChanged
{
    private string _title;
    public string Title
    {
        get { return _title; }
        set { _title = value; RaisePropertyChanged("Title"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}
于 2013-01-21T21:34:41.050 に答える