2017-12-08 17 views
1

그래픽 내에 두 개의 수평선을 표시하고 싶습니다. 선의 위치는 일부 데이터에 따라 다릅니다. 그 때문에 ValueConverter를 만들었습니다 (기본적으로 int를 double로 설정). 문제는 선이 항상 같은 위치에 표시된다는 것입니다.WPF 내 Line 개체가 위치를 변경하지 않는 이유는 무엇입니까?

내가 다음 XAML에 있습니다 : 나는 또한 변환하기 전에이 시도

namespace CGM_Auswertung 
{ 
    public class ViewModelBase : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(PropertyChangedEventArgs e) 
     { 
      PropertyChanged?.Invoke(this, e); 
     } 
    } 

    public class ViewModel : ViewModelBase 
    { 
     ... 

     private double _optMinimum; 
     public double OptMinimum 
     { 
      get { return _optMinimum; } 
      set 
      { 
       _optMinimum = value; 
       OnPropertyChanged(new PropertyChangedEventArgs("OptMinimum")); 
      } 
     } 

     private double _optMaximum; 
     public double OptMaximum 
     { 
      get { return _optMaximum; } 
      set 
      { 
       _optMaximum = value; 
       OnPropertyChanged(new PropertyChangedEventArgs("OptMaximum")); 
      } 
     } 


    } 

    public class DoubleToPositionConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return (int)(Math.Abs(400 - (double)value * 20)); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return (double)(Math.Abs((double)value/20 - 400/20)); 
     } 
    } 
} 

:

<Window 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:local="clr-namespace:CGM_Auswertung" 
      xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="CGM_Auswertung.MainWindow" 
      mc:Ignorable="d" 
      Title="MainWindow" Height="780" Width="1300" Loaded="Window_Loaded"> 
     <Window.Resources> 
      <local:DoubleToPositionConverter x:Key="DtPConverter"/> 
     </Window.Resources> 
     <Grid Name="MainGrid"> 
      <StackPanel Margin="10" Orientation="Vertical"> 
       <Button Name="OpenFile" Content="Öffnen" Height="30" Margin="550,0" Click="OpenFile_Click"/> 
       <Grid x:Name="drawGrid" > 
        <TextBox Height="30" Width="40" HorizontalAlignment="Left" VerticalAlignment="Top" Text="{Binding OptMinimum}"/> 
        <Frame x:Name="drawFrame" HorizontalAlignment="Left" Height="420" Margin="40,10,10,50" VerticalAlignment="Top" Width="1210" BorderBrush="Black" BorderThickness="3"> 
         <Frame.Content> 
          <Grid Name="contentGrid" Background="Transparent" > 
           <Line x:Name="MinLine" Stroke="Red" StrokeThickness="2" StrokeDashArray="2,2" X1="0" X2="1200" Y1="{Binding OptMinimum, Converter={StaticResource DtPConverter}}" Y2="{Binding OptMinimum, Converter={StaticResource DtPConverter}}"/> 
           <Line x:Name="MaxLine" Stroke="Red" StrokeThickness="2" StrokeDashArray="2,2" X1="0" X2="1200" Y1="{Binding OptMaximum, Converter={StaticResource DtPConverter}}" Y2="{Binding OptMaximum, Converter={StaticResource DtPConverter}}"/> 
           <Grid Name="vertLineGrid" MouseMove="tempLineGrid_MouseMove" Background="Transparent" HorizontalAlignment="Center" VerticalAlignment="Center" Height="394" Width="1183" MouseUp="ReleaseSelectedItem"/> 
          </Grid> 
         </Frame.Content> 
... 

이 컨버터입니다

[ValueConversion(typeof(double),typeof(int))] 

하지만 변화하지 않았다 anything 그리고 여기 내 프로그램의 시작입니다 :

namespace CGM_Auswertung 
{ 
    /// <summary> 
    /// Interaktionslogik für MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 

     private List<CGM_Measurement> completeMeasures = new List<CGM_Measurement>();  
     private ViewModel mvm = new ViewModel() { MinimalValue = 0, MaximalValue=0, ActualValue=0}; 
     private UIElement selectedItem = null; 

     public MainWindow() 
     { 
      mvm.FirstDay = mvm.LastDay = DateTime.Today; 
      mvm.OverviewText = "Switch to day view"; 
      mvm.Visual = Visibility.Visible; 
      mvm.VisualInverse = Visibility.Collapsed; 
      mvm.OptMinimum = 2.0; 
      mvm.OptMaximum = 3.0; 

      InitializeComponent(); 

      MainGrid.DataContext = mvm; 

     } 

내 변환기 내에서 중단 점을 설정할 때 변환이 호출되지 않기 때문에 어딘가에 xaml이 있다고 생각합니다.

변환이 너무 간단하여 내 viewmodel 내에서 다른 속성을 사용할 수 있기 때문에 추측합니다. 하지만 여전히 WPF에 대해 배운 이후로 저는 가치있는 변환기로 그것을하고 싶습니다.

도움 주셔서 감사합니다.

+0

컨버터에 중단 점을 설정하여 호출되는 것을 테스트 했습니까? –

+2

왜 'IValueConverter'을 사용하여 계산을하고 있습니까? A 변환기는 레이아웃/응용 프로그램 논리에 참여하지 않고 개체의 형식을 변환해야합니다. 'IValueConverter'를 그러한 작업에 오용하는 것을 장려하는 많은 SO 응답이 있지만, 대부분은 나쁜 코드/디자인에 대한 추악한 해결 방법을 소개합니다. – dymanoid

+0

@dymanoid : 나는 객체를 변환해야한다고 알고 있습니다. 이것은 근본적으로 한 좌표 공간의 좌표를 다른 좌표 공간으로 변환하는 좌표 변환입니다. 그래서 가장 넓은 방법으로 전환. 뷰 모델에 추가 속성을 추가하지 않고도이를 수행하는 방법에 대한 또 다른 제안이 있습니까? 텍스트 상자에서는 변환하지 않은 동일한 속성이 사용되기 때문입니다. 내가 알고 있지 못하는 좌표 변형을위한 쿨한 감각으로 만들어 졌는가? – Thoms

답변

2

Frame 부모 컨테이너의 DataContext를 상속하지 않습니다 (this SO post에서 설명). 따라서 contentGrid의 바인딩 소스가 누락되었습니다. 결과적으로 바인딩은 해결되지 않고 변환기는 호출되지 않습니다. Frame을 ContentControl으로 바꾸거나 완전히 제거하십시오.

+0

+1 또한 '프레임'은 웹 콘텐츠를 표시하는 데 사용할 수 있습니다. 이 기능이 필요한 경우에는 대신 MSDN에서 '페이지'를 사용하는 것이 좋습니다. [MSDN] (https://msdn.microsoft.com/en-us/library/system.windows.controls.frame (v = vs.110) .aspx # 설명) : "콘텐츠 유형은 .NET 프레임 워크 개체 및 HTML 파일 그러나 일반적으로 페이지는 탐색을 위해 콘텐츠를 패키지화하는 방법으로 선호됩니다 ([Page] (https://msdn.microsoft.com/en-us/library/system.windows.controls. 페이지 (v = vs.110) .aspx)). " – Stewbob