WPF dwa pytania - konwersja wartości i wyrównanie wartości

0

Krótkie pytanie.

Mam DataGrida, w którym wartość komórki może być:

  • tekstem
  • liczbą ujemną
  • liczbą dodatnią

Chcę to ostylować, przy czym styl trzymam w ResourceDictionary w zależności od wartości.

  • tekst lub liczba ujemna - kolor czerwony
  • liczba dodatnia - kolor zielony

Conwertera nie użyję w ResourceDictionary, prawda? Jakim sposobem to rozwiązać?

Pytanie numer 2. Chcę wyrównać w komórkach tekst w pionie i poziomie do środka.
<Setter Property="VerticalAlignment" ...
<Setter Property="VerticalContentAlignment" ...
<Setter Property="HorizontalAlignment" ...
<Setter Property="HorizontalContentAlignment" ...

Nie pomagają.

0

Masz kod na dobry początek do lekkiego dopracowania. :D

XAML:

<Window x:Class="TestOne.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:testOne="clr-namespace:TestOne"
        Title="MainWindow" Height="350" Width="525">
	<Window.Resources>
		<testOne:SourceDefaultValueConverter x:Key="ChangeColor" />
	</Window.Resources>
	<Grid>
		<DataGrid HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding ValuesCollection}"
		          AutoGenerateColumns="False">
			<DataGrid.Columns>
				<DataGridTextColumn Header="Name" Binding="{Binding Name}">
					<DataGridTextColumn.ElementStyle>
						<Style TargetType="TextBlock">
							<Setter Property="HorizontalAlignment" Value="Center" />
						</Style>
					</DataGridTextColumn.ElementStyle>
				</DataGridTextColumn>
				<DataGridTextColumn Header="Value" Binding="{Binding Value}">
					<DataGridTextColumn.ElementStyle>
						<Style TargetType="TextBlock">
							<Setter Property="Background"
							        Value="{Binding RelativeSource={RelativeSource Self}, Path=Text,
								UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ChangeColor}}" />
						</Style>
					</DataGridTextColumn.ElementStyle>
				</DataGridTextColumn>
			</DataGrid.Columns>
		</DataGrid>
	</Grid>
</Window>

MainWindow:

#region

using System.Collections.Generic;
using System.Windows;

#endregion

namespace TestOne
{
	/// <summary>
	///    Interaction logic for MainWindow.xaml
	/// </summary>
	public partial class MainWindow : Window
	{
		public MainWindow()
		{
			InitializeComponent();
			DataContext = this;
			ValuesCollection = new List<Foo>
			{
				new Foo {Name = "Słowo", Value = "ad"},
				new Foo {Name = "Liczba dodatnia", Value = "100"},
				new Foo {Name = "Liczba ujemna", Value = "-100"}
			};
		}

		public List<Foo> ValuesCollection { get; set; }
	}

	public class Foo
	{
		public string Name { get; set; }

		public string Value { get; set; }
	}
}

Konwerter:

#region

using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;

#endregion

namespace TestOne
{
	public class SourceDefaultValueConverter : IValueConverter
	{
		public object Convert(object value, Type targetType, object parameter, CultureInfo
			culture)
		{
			var staff = (string) value;
			int result;
			var parsed = int.TryParse(staff, out result);
			return !parsed || result < 0
				       ? new SolidColorBrush(Colors.Red)
				       : new SolidColorBrush(Colors.Blue);
		}

		public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
		{
			return value;
		}
	}
}
0

Dzięki za chęci, ale chyba kompletnie nie o to mi chodzi. Otóż ja to muszę zrobić w ResourceDictionary. Nie z mojego wyboru. A tam nie dostanę się do konwertera chyba - nie da się, lub nie umiem.

0

Problemem nie jest wywołanie konwertera problemem jest to co chcesz zmienić:
http://stackoverflow.com/a/4251259

Bo co to za problem wywołać konwerter w jakimkolwiek resources:

<Application x:Class="TestOne.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml"
		xmlns:testOne="clr-namespace:TestOne">
	
	<Application.Resources>
		<testOne:SourceDefaultValueConverter x:Key="ChangeColor" />
		<Style TargetType="TextBox">
			<Setter Property="Background"
							        Value="{Binding RelativeSource={RelativeSource Self}, Path=Text,
								UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ChangeColor}}" />
		</Style>
	</Application.Resources>
</Application>

I zadziała ten konwerter na każdy TextBox w aplikacji...

0

Masz rację, dziękuję. A mógłbyś napisać, jak użyć konwertera nie na całej aplikacji, tylko w konkretnym resourcesdictionary?

0

A niech będzie...

TestDictionary.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:testOne="clr-namespace:TestOne">

   <testOne:SourceDefaultValueConverter x:Key="ChangeColor" />
   <Style TargetType="TextBox">
      <Setter Property="Background"
                                    Value="{Binding RelativeSource={RelativeSource Self}, Path=Text,
                                UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ChangeColor}}" />
   </Style>
</ResourceDictionary>

MainWindow.xaml:

<Window x:Class="TestOne.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
   <Window.Resources>
      <ResourceDictionary Source="TestDictionary.xaml" />
   </Window.Resources>
   <Grid>
      <TextBox />
   </Grid>
</Window>

Całe reszta się nie zmienia. ;)

0

Dziękuję! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1