2017-01-03 44 views
8

Muszę zaakceptować zarówno , i . w edytowalnej DataGridColumn niezależnie od kultury. Po wpisaniu wartości jest sformatowany do używania jako separatora dziesiętnego jako ..Jak włączyć pisanie zarówno, jak i. następnie formatowanie go. dla DataGridColumn we wszystkich kulturach?

Obecnie wystarczy użyć:

<DataGridTextColumn Header="{StaticResource XpStrSize}" Binding="{Binding Size}" IsReadOnly="False"/> 

Powierzchnia mieszkania związany w ViewModel jest typu podwójnego.

Jeśli użytkownik wpisze 100,3, powinien zostać zaktualizowany jako 100.3 w powiązanej właściwości. Może również wprowadzić 2.0, który powinien wynosić 2.0. Co więcej, gdy użytkownik wprowadza 100,3, jest aktualizowany w kolumnie jako 100.3, gdy fokus opuszcza pole.

+0

Idziesz do zaakceptowania ' ''' jako separator cyfr, jak również? – Abion47

+0

nie. tylko dla dziesiętnych. Słuszna uwaga. w mojej kulturze te nie są używane –

+0

Następnie wystarczy użyć 'string formatted = raw.Replace (',', '.');' – Abion47

Odpowiedz

0

wystąpić limity podczas wiązania podwójne (lub int) do TextBox (który jest tworzony przez DataGridTextColumn w trybie edycji): masz tylko ograniczony wpływ foreward i wstecznej konwersji zi do łańcucha. Jednym z rozwiązań pozwalających uzyskać większą kontrolę jest wprowadzenie nowej właściwości, która jest ciągiem typu i reprezentuje twój podwójny łańcuch w żądanym formacie. Wiążesz tę nową właściwość w XAML i wykonujesz resztę magii (konwersja do przodu i do tyłu) w swoim modelu widoku. Obie właściwości aktualizują się nawzajem po zmianie. Innymi słowy: ciąg na XAML, podwójne modelu i viewmodel łączy oba:

XAML:

<DataGridTextColumn Header="{StaticResource XpStrSize}" Binding="{Binding SizeAsString}" IsReadOnly 

ViewModel:

private double size; 

public double Size 
{ 
    get 
    { 
     return size; 
    } 
    set 
    { 
     size = value; 
     NotifyPropertyChanged(); 

     sizeAsString = FormatTheDoubleAccordingYourRequirements (size); 
     NotifyPropertyChanged ("SizeAsString"); 
    } 
} 

private string sizeAsString; 

public string SizeAsString 
{ 
    get 
    { 
     return sizeAsString; 
    } 
    set 
    { 
     sizeAsString = value; 
     Size = ParseTheStringAccordingYourRequirements (sizeAsString); 
     NotifyPropertyChanged(); 
    } 
} 
+0

Czy to nie pozwala, aby cokolwiek zostało napisane w polu tekstowym w kolumnie? –

+0

Nie jestem pewien, co masz na myśli z pytaniem. Przy takim podejściu 'DataGridTextColumn'" widzi "ciąg tylko do edycji. Ale twój mistrz jest podwójny i konwertujesz go w tę iz powrotem. Ciąg zapewnia pełną elastyczność, której potrzebujesz. Przy okazji, robienie tego w ten sposób jest pewnego rodzaju standardem, jeśli chodzi o wyrafinowane sprawdzanie poprawności danych podczas edycji. – gomi42

+0

Mam na myśli to, że jeśli po prostu zwiążę podwójnie, otrzymam czerwone obramowanie wokół pola tekstowego, jeśli nie jest to prawnie podwójne. czy nie jest to również nieskończona pętla? wykonanie przechodzi z zestawu do ustawionego w nieskończoność? –

0

ten powinien działać we wszystkich kulturach. Daleko od doskonałości, ale spełnia minimalne wymagania.

Więc moja "walidacja" jest tylko zmienić niepoprawną wartość (jak 3,0 godziny lub ere) do 1,0

XAML:

<DataGrid.Resources> 
    <cnv:DoubleToTextConverter x:Key="DoubleToTextConverter" /> 
    <sys:Double x:Key="DoubleOne">1.0</sys:Double> 
</DataGrid.Resources> 
<!-- ... --> 
    <DataGridTextColumn Header="{StaticResource XpStrSize}" Binding="{Binding Size, Converter={StaticResource DoubleToTextConverter}, ConverterParameter={StaticResource DoubleOne}, UpdateSourceTrigger=LostFocus}" IsReadOnly="False"/> 

konwerter:

public class DoubleToTextConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     return ((double) value).ToString("0.0", System.Globalization.CultureInfo.InvariantCulture); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     double doubleValue; 
     if (double.TryParse(value.ToString().Replace(',', '.'), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, 
      out doubleValue)) 
     { 
      return doubleValue; 
     } 
     if (parameter != null && parameter is double) 
      return (double)parameter; 

     return 0.0; 
    } 
} 

nieruchomość jest w ViewModel wciąż podwójne. Nie jest wymagana dodatkowa właściwość łańcucha.

+1

dlaczego downvote? szczere pytanie. nie mam pojęcia, co jest z tym nie tak. –

0

proszę skorzystać z poniższego kodu, to jest praca:

public partial class MainWindow:Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     List<MyClass> myClasses=new List<MyClass>(); 
     dataGrid.ItemsSource=myClasses; 
    } 
} 

public class MyClass 
{ 
    public double Size { get; set; } 
} 

public class SizeConverter:IValueConverter 
{ 
    public object Convert(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture) 
    { 
     return System.Convert.ToString (value); 
    } 

    public object ConvertBack(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture) 
    { 
     try 
     { 
      string size=System.Convert.ToString (value); 
      string[] s=size.Split (','); 
      if (s.Count()==2) 
       return System.Convert.ToDouble (s[0]+'.'+s[1]); 
      else 
       return System.Convert.ToDouble (value); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show (e.Message); 
     } 
     return 0; 
    } 
} 

XAML:

<Window.Resources> 
    <sc:SizeConverter x:Key="sizeConverter" /> 
</Window.Resources> 
<Grid> 
    <DataGrid Name="dataGrid" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Size" Binding="{Binding Path=Size,Converter={StaticResource sizeConverter}}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid>