2

私は自分の ViewModel を持つ UserControl(AutoComplete) を持っています。ウィンドウ内で UserControl を使用すると、正常に実行され、サービスに接続され、データが正しく描画されます。UserControl のデータ コンテキストは xaml を介して設定され、メイン ウィンドウの viewModel のプロパティにバインドされます。

さて、UserControl がメイン ウィンドウ ビュー モデルからデータをロードできるようにします。問題は、ユーザーコントロールが国をロードすると仮定することです。ユーザーコントロールに入力すると、国のリストが返され、そのうちの1つ、つまり「スペイン」を選択すると、ユーザーコントロールのSelectedItemプロパティが「スペイン」に更新されます。メイン ウィンドウのビューモデルのオブジェクトを「スペイン」に更新し、その逆も同様に更新したいのですが、メイン ウィンドウのビューモデルで国オブジェクトを更新すると、ユーザーの選択項目も更新されます。

どうすればそれを達成できますか

メインビューにこれがあります:

<amctrls:AmAutoCompleteView DataContext="{Binding controladorAutoCompleteCountry}" /> 

ユーザーコントロールは次のようになります。

<telerik:RadComboBox Margin="2,0,0,0" Grid.Row="0" Grid.Column="0"  
            IsEditable="True"
            Name="RadCbo"
            ItemsSource="{Binding objectList}" 
            DisplayMemberPath="{Binding fieldToShow}"
            OpenDropDownOnFocus="True"
            SelectedItem="{Binding selectedCountry, Mode=TwoWay}"
            Text="{Binding searchText, Mode=TwoWay}"
            IsTextSearchEnabled="False" 
            StaysOpenOnEdit="True" />

controladorAutoCompleteCountry は、usercontrol ビューモデルのインスタンスであるメインビューのプロパティです。

メインビューのビューモデルは住所を管理します。私が望むのは、住所を編集するために住所の国をユーザーコントロールにバインドすることです。ユーザーコントロールをそのコントローラーのインスタンスにバインドしている場合、アドレスの Country オブジェクトをバインドするにはどうすればよいですか?

4

2 に答える 2

1

これらの 2 つのビューを独立させる必要がある場合は、コントロールを再利用したい場合に適しています。イベント アグリゲーターまたは単純なイベントを使用してください。ユーザー コントロールで項目が選択されるたびに、何か興味深いことが起こったことを示すイベントが公開されます。メイン ビューモデルは、これらのイベントをサブスクライブして、必要な処理を実行できます。単純なケースは、イベントと RaiseEvent メソッドを使用して静的クラスを作成することです。ユーザー コントロールは RaiseEvent であり、メイン ビューモデルはイベントをサブスクライブします。それらの間で渡されるデータは、イベント引数に追加できます。

于 2012-07-27T09:03:47.817 に答える
0

少し逆ですが、次のようなことを試すことができます。

MainView を持っている

  • comboboxこれは、文字列プロパティ SelectedCountry およびメソッド ChangeCountry() にバインドされています
  • ContentControlCountryInfoViewModel プロパティにバインドされている SelectedCountryControl

MainView に読み込まれた CountryInfoViewModel にコンボボックスをバインドできるようになりました。

以下は私にとってうまくいった例です(ここではcaliburn microを使用したことに注意してください)。基本的に、別の国が選択されたときに CountryInfoViewModel/View を更新します。ChangeCountry メソッドを改善してすべてのデータを取得できます。もちろん、CountryInfoViewModel/View を改善して、必要なものをすべて表示することもできます。

MainViewModel

class MainViewModel : Screen
{
    #region fields

    private BindableCollection<string> _listOfCountries;
    private string _selectedCountry;
    private CountryInfoViewModel _selectedCountryControl;

    #endregion fields

    #region properties

    public BindableCollection<string> ListOfCountries
    {
        get
        {
            return new BindableCollection<string>
                       {
                           "France",
                           "Holland",
                           "Russia"
                       };
        }
    }

    public string SelectedCountry
    {
        get { return _selectedCountry; }
        set
        {
            _selectedCountry = value;
            NotifyOfPropertyChange(() => SelectedCountry);
        }
    }

    public CountryInfoViewModel SelectedCountryControl
    {
        get { return _selectedCountryControl; }
        set
        {
            _selectedCountryControl = value;
            NotifyOfPropertyChange(() => SelectedCountryControl);
        }
    }

    #endregion properties

    public MainViewModel()
    {
        SelectedCountry = "Holland";
        ChangeCountry();
    }

    public void ChangeCountry()
    {
        SelectedCountryControl = new CountryInfoViewModel()
                                   {
                                       CountryName = SelectedCountry
                                   };
    }
}

メインビュー:

<UserControl x:Class="WpfModifyDifferentView.Views.MainView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel>
        <ComboBox x:Name="ChangeCountry" SelectedItem="{Binding SelectedCountry}" ItemsSource="{Binding ListOfCountries}"/>
        <ContentControl x:Name="SelectedCountryControl"/>
    </StackPanel>
</UserControl>

CountryInfoViewModel:

class CountryInfoViewModel : Screen
{
    #region fields

    private string _countryName;

    #endregion fields

    #region properties

    public string CountryName
    {
        get { return _countryName; }
        set
        {
            _countryName = value;
            NotifyOfPropertyChange(() => CountryName);
        }
    }

    #endregion properties

}

CountryInfoView:

<UserControl x:Class="WpfModifyDifferentView.Views.CountryInfoView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel Orientation="Vertical">
        <TextBlock Text="You have chosen the country:"/>
        <TextBlock x:Name="CountryName"/>
    </StackPanel>
</UserControl>
于 2012-07-27T09:20:39.297 に答える