2017-05-15 2 views
1

ViewModel에 선언 된 [ "SampleName"] 속성을 바인딩하려고합니다. 여기서 SampleName은 키입니다. 그러나 코드 아래에서 시도하면 비어 있습니다.WPF 현지화 된 확장 MVVM 바인딩

<TextBlock FontSize="14" Text="{lex:BLoc Value=SampleName}" lex:ResxLocalizationProvider.DefaultAssembly="SAS.Resources" lex:ResxLocalizationProvider.DefaultDictionary="Report" HorizontalAlignment="Center" VerticalAlignment="Top" TextDecorations="Underline" FontWeight="DemiBold" Grid.Row="0" Grid.ColumnSpan="{Binding Path=SpanCount}" Grid.Column="0"/> 

제게 알려주십시오.

+0

동일한 문제가 있습니다. 어떤 해결책을 찾았습니까? –

답변

0

소스 코드를 확인한 결과 BLoc이 그렇게했다고 생각하지 않습니다. 그러나 나는 같은 결과를 보관하는 다른 방법을 발견했다.

this 대답을 바탕으로, 나는이 해결책을 생각해 냈습니다. 보기에 자원 키를 제공하는 대신 자원 값을 제공합니다. 문화가 변경되면 값도 변경됩니다. 다음은 핵심 구현입니다.

public class MyViewModel : INotifyPropertyChanged { 

    public MyViewModel() 
    { 
     // Properties.Resources is my Resources.resx file and String1 is my resource key 
     BindPropertyToResource(nameof(Name), nameof(Properties.Resources.String1)); 
    } 


    private string _name; 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      if (_name != value) 
      { 
       _name = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 

    protected void BindPropertyToResource(string propertyName, string resourceKey){ 
     WPFLocalizeExtension.Providers.ResxLocalizationProvider resxLocalizationProvider 
      = WPFLocalizeExtension.Providers.ResxLocalizationProvider.Instance; 

     WPFLocalizeExtension.Providers.ResxLocalizationProvider.SetDefaultAssembly(resxLocalizationProvider, System.Reflection.Assembly.GetCallingAssembly().GetName().Name); 
     WPFLocalizeExtension.Providers.ResxLocalizationProvider.SetDefaultDictionary(resxLocalizationProvider, nameof(Properties.Resources)); 

     var targetProperty = this.GetType().GetProperty(propertyName); 
     var locBinding = new WPFLocalizeExtension.Extensions.LocTextExtension(resourceKey); 

     locBinding.SetBinding(this, targetProperty); 
    } 


    #region INotifyPropertyChanged Members 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion // INotifyPropertyChanged Members 
} 

희망 해결 방법은이 문제를 해결합니다.

관련 문제