2012-01-27 6 views
1

エンティティフレームワークモデルを使用するWPFアプリケーションがあります。エンティティの1つは従業員タイプです。このエンティティには、中でもLastNameおよびFirstNameプロパティがあります。しかし、私のxamlでは、DataGridに完全な名前を表示したいと思います。この部分クラスを作成してフルネームを返し、このプロパティをDataGridに表示します。これは素晴らしいです。 FullNameは、期待どおりにDataGridに表示されます。パーシャルクラスを更新するにはどうすればいいですか

私の問題は、編集フォームにLastNameとFirstNameプロパティにバインドされたテキストボックスがあることです。 CompanyName、LastName、FirstName、HireDateなどの値を更新すると、変更されたDataGridのすべての列が正しく更新されますが、FullNameプロパティは更新されません。

残りのDataGridプロパティが更新されるうちに、私のFullName部分クラスが更新されないのはなぜですか?これを修正するにはどうすればよいですか?

私の編集フォームxamlです。

<TextBox Grid.Column="1" Name="txtCompany" Text="{Binding SelectedEmployee.Company, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
<TextBox Grid.Column="1" Name="txtFirstName" Text="{Binding SelectedEmployee.FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
<TextBox Grid.Column="1" Name="txtLastName" Text="{Binding SelectedEmployee.LastName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
<TextBlock Grid.Column="1" Name="txtFullName" Grid.Row="2" Margin="2" Text="{Binding SelectedEmployee.FullName" /> -- Also show as column in DataGrid 
+0

、プロパティを使用しているが、イベントを変更しますが、このようなMultiBindingのを作るのでしょうか? – Kevin

答えて

2

WPFの変更通知はINotifyPropertyChangedインターフェイスで行われます。

生成されたエンティティ(デフォルトのedmxテンプレートによって)がこのインターフェイスを実装し、生成されたプロパティ設定ツールがPropertyChangedイベントを発生させるため、Entity Frameworkと同時に動作します。

あなたの新しいプロパティは、このイベントを発生させていないが、これら2つの変更は、あなたがPropertyChangedイベントを発生させる必要がある場合にはLastNameFirstNameから算出しているため。

幸いにもEFはあなたがイベントを発生させることができ、そこから名前OnSomePropertyChangedを持つ各プロパティのセッターに部分メソッドが生成されます。適切なStringFormatとMultiBindingを使用すると、背後にある任意の追加コードを避けるだろうとなり

public partial class Employee 
{ 
    public string FullName 
    { 
     get { return LastName.Trim() + ", " + FirstName.Trim(); } 
    } 

    partial void OnLastNameChanged() 
    { 
     base.OnPropertyChanged("FullName"); 
    } 

    partial void OnFirstNameChanged() 
    { 
     base.OnPropertyChanged("FullName"); 
    } 
} 
1

それはEFが何をするかに依存しないという点でより一般的な解決策です。

<TextBlock Name="fullNameTextBlock"> 
    <TextBlock.Text> 
     <MultiBinding StringFormat="{}{1}, {0}"> 
      <Binding Path="FirstName"/> 
      <Binding Path="LastName"/> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

もう少し複雑な、しかし、さらに一般的なアプローチは、と一緒にMultiBindingのを使用することであろう:XAMLの文字列に中括弧を可能にする、{}主要でフォーマット文字列の面白い表記を注IMultiValueConverter

<TextBlock Name="fullNameTextBlock"> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource FullNameConverter}"> 
      <Binding Path="FirstName"/> 
      <Binding Path="LastName"/> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

コンバータは、基本的に次のようになります:

public class FullNameConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return ((string)values[1]).Trim() + ", " + ((string)values[0]).Trim(); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+2

あなたはコンバータを必要としません。バインディングのstringformatオプションを使用することができます。 –

+0

ありがとうございました。私はそれを認識しておらず、解決策をはるかに簡単にしています。なぜなら、コードの背後にあるコードを完全に回避するからです。私はそれに応じて私の答えを編集しました。 – Clemens

+0

これはうまくいくはずですが、私の状況では、FullNameプロパティはUIの多くの場所で使用されます。 – Jerry

関連する問題