Cách convert kết quả ra label?

Em đã tạo 1 form tính toán hiệu suất tổng thể OEE như vầy và đã lập công thức tự động tính, nhờ anh chị hướng dẫn em cách convert kết quả hiển thị tự động ra TextBox hoặc Label với ạ!


code:

<Window x:Class="WpfApp3.MainWindow"
        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:WpfApp3"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Label Content="           Overall Equipment Effectiveness Calculator" HorizontalAlignment="Left" Margin="85,10,0,0" VerticalAlignment="Top" Width="675" FontSize="24"/>
        <Label Content="Shift length (m)" HorizontalAlignment="Left" Margin="10,74,0,0" VerticalAlignment="Top" Width="98"/>
        <Label Content="Breaks (m)" HorizontalAlignment="Left" Margin="10,119,0,0" VerticalAlignment="Top" Width="75"/>
        <Label Content="Stop Time (m)" HorizontalAlignment="Left" Margin="10,166,0,0" VerticalAlignment="Top" Width="92"/>
        <Label Content="Ideal Cycle time (m)" HorizontalAlignment="Left" Margin="10,208,0,0" VerticalAlignment="Top" Width="115"/>
        <Label Content="Total count (#)" HorizontalAlignment="Left" Margin="10,246,0,0" VerticalAlignment="Top" Width="115"/>
        <Label Content="Reject count (#)" HorizontalAlignment="Left" Margin="10,292,0,0" VerticalAlignment="Top" Width="115"/>
        <TextBox x:Name="ShiftLength" HorizontalAlignment="Left" Height="23" Margin="125,74,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="Breaks" HorizontalAlignment="Left" Height="23" Margin="125,121,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="StopTime" HorizontalAlignment="Left" Height="23" Margin="125,168,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="IdealCycleTime" HorizontalAlignment="Left" Height="23" Margin="130,211,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="TotalCount" HorizontalAlignment="Left" Height="23" Margin="130,249,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="RejectCount" HorizontalAlignment="Left" Height="23" Margin="130,292,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <Label Content="OEE :" HorizontalAlignment="Left" Margin="33,344,0,0" VerticalAlignment="Top" Width="75"/>
        <Label Content="Planned production time (m)" HorizontalAlignment="Left" Margin="430,57,0,0" VerticalAlignment="Top" Width="168" Height="35"/>
        <Label Content="Run time (m)" HorizontalAlignment="Left" Margin="430,103,0,0" VerticalAlignment="Top" Width="168" Height="23"/>
        <Label Content="Good count (#)" HorizontalAlignment="Left" Margin="430,147,0,0" VerticalAlignment="Top" Width="108" Height="23"/>
        <Label Content="Availability (%)" HorizontalAlignment="Left" Margin="430,185,0,0" VerticalAlignment="Top" Width="108" Height="23"/>
        <Label Content="Performance (%)" HorizontalAlignment="Left" Margin="430,231,0,0" VerticalAlignment="Top" Width="108" Height="23"/>
        <Label Content="Quality (%)" HorizontalAlignment="Left" Margin="430,274,0,0" VerticalAlignment="Top" Width="108" Height="31"/>
        <Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="42" Margin="145,10,0,0" VerticalAlignment="Top" Width="484"/>
        <Label Name="PlannedProductionTime" Content="" HorizontalAlignment="Left" Margin="666,57,0,0" VerticalAlignment="Top" Width="94"/>
        <Label Name="RunTime" Content="" HorizontalAlignment="Left" Margin="666,101,0,0" VerticalAlignment="Top" Width="94"/>
        <Label Name="GoodCount" Content="" HorizontalAlignment="Left" Margin="666,148,0,0" VerticalAlignment="Top" Width="94"/>
        <Label Name="Availability" Content="" HorizontalAlignment="Left" Margin="666,190,0,0" VerticalAlignment="Top" Width="94"/>
        <Label Name="Performance" Content="" HorizontalAlignment="Left" Margin="666,236,0,0" VerticalAlignment="Top" Width="94"/>
        <Label Name="Quality" Content="" HorizontalAlignment="Left" Margin="666,279,0,0" VerticalAlignment="Top" Width="94"/>
        <Label Name="Oee" Content="" HorizontalAlignment="Left" Margin="176,352,0,0" VerticalAlignment="Top" Width="207"/>
    </Grid>
</Window>

Bắt sự kiện TextChanged. Từ khóa: wpf textbox textchange.

3 Likes

em Binding mà không được anh ạ

anh xem giúp em 2 đoạn code xaml với cs cần chỉnh sửa gì không ạ

<Window x:Class="Factorant.OEE.WPF.MainWindow"
        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:vm="clr-namespace:Factorant.OEE.WPF.Models"
        mc:Ignorable="d"
           Title="OEE Calculator" Height="450" Width="800">
    <Window.Resources>
        <vm:OeeCalcModelIn x:Key="viewModel"/>
    </Window.Resources>

    <Grid>
        <Label Content="           Overall Equipment Effectiveness Calculator" HorizontalAlignment="Left" Margin="85,10,0,0" VerticalAlignment="Top" Width="675" FontSize="24"/>
        <Label Content="Shift length (m)" HorizontalAlignment="Left" Margin="10,74,0,0" VerticalAlignment="Top" Width="98"/>
        <Label Content="Breaks (m)" HorizontalAlignment="Left" Margin="10,119,0,0" VerticalAlignment="Top" Width="75"/>
        <Label Content="Stop Time (m)" HorizontalAlignment="Left" Margin="10,166,0,0" VerticalAlignment="Top" Width="92"/>
        <Label Content="Ideal Cycle time (m)" HorizontalAlignment="Left" Margin="10,208,0,0" VerticalAlignment="Top" Width="115"/>
        <Label Content="Total count (#)" HorizontalAlignment="Left" Margin="10,246,0,0" VerticalAlignment="Top" Width="115"/>
        <Label Content="Reject count (#)" HorizontalAlignment="Left" Margin="10,292,0,0" VerticalAlignment="Top" Width="115"/>
        <TextBox x:Name="ShiftLength" HorizontalAlignment="Left" Height="23" Margin="125,74,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>

        <TextBox x:Name="Breaks" HorizontalAlignment="Left" Height="23" Margin="125,121,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="StopTime" HorizontalAlignment="Left" Height="23" Margin="125,168,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="IdealCycleTime" HorizontalAlignment="Left" Height="23" Margin="130,211,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="TotalCount" HorizontalAlignment="Left" Height="23" Margin="130,249,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="RejectCount" HorizontalAlignment="Left" Height="23" Margin="130,292,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <Label Content="OEE :" HorizontalAlignment="Left" Margin="33,344,0,0" VerticalAlignment="Top" Width="75"/>
        <Label Content="Planned production time (m)" HorizontalAlignment="Left" Margin="430,57,0,0" VerticalAlignment="Top" Width="168" Height="35"/>
        <Label Content="Run time (m)" HorizontalAlignment="Left" Margin="430,103,0,0" VerticalAlignment="Top" Width="168" Height="23"/>
        <Label Content="Good count (#)" HorizontalAlignment="Left" Margin="430,147,0,0" VerticalAlignment="Top" Width="108" Height="23"/>
        <Label Content="Availability (%)" HorizontalAlignment="Left" Margin="430,185,0,0" VerticalAlignment="Top" Width="108" Height="23"/>
        <Label Content="Performance (%)" HorizontalAlignment="Left" Margin="430,231,0,0" VerticalAlignment="Top" Width="108" Height="23"/>
        <Label Content="Quality (%)" HorizontalAlignment="Left" Margin="430,274,0,0" VerticalAlignment="Top" Width="108" Height="31"/>
        <Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="42" Margin="145,10,0,0" VerticalAlignment="Top" Width="484"/>
        <TextBlock x:Name="Oee" HorizontalAlignment="Left" Margin="181,349,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="21" Width="162"/>
        <TextBlock x:Name="PlannedProductionTime" HorizontalAlignment="Left" Margin="666,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="15" Width="94"
         Text="{Binding ElementName=ShiftLength, Path=Text}"/>
        <TextBlock x:Name="RunTime" HorizontalAlignment="Left" Margin="666,103,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="23" Width="94"
        Text="{Binding ElementName=Breaks, Path=Text}"/>
        <TextBlock x:Name="GoodCount" HorizontalAlignment="Left" Margin="666,147,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="23" Width="94"
        Text="{Binding ElementName=StopTime, Path=Text}"/>
        <TextBlock x:Name="Availability" HorizontalAlignment="Left" Margin="666,192,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="94"
        Text="{Binding ElementName=IdealCycleTime, Path=Text}"/>
        <TextBlock x:Name="Performance" HorizontalAlignment="Left" Margin="666,231,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="23" Width="83"
        Text="{Binding ElementName=TotalCount, Path=Text}"/>
        <TextBlock x:Name="Quality" HorizontalAlignment="Left" Margin="666,274,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="31" Width="94"
                   Text="{Binding ElementName=RejectCount, Path=Text}"/>
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
//--
using Factorant.OEE.WPF.Models;
//---
namespace Factorant.OEE.WPF.Models
{
    public struct OeeCalcModelIn
    {
        public decimal ShiftLength;
        public decimal Breaks;
        public decimal StopTime;
        public decimal IdealCycleTime;
        public decimal TotalCount;
        public decimal RejectCount;
    }
}
namespace Factorant.OEE.WPF.Models
{
    public struct OeeCalcModelOut
    {
        public decimal PlannedProductionTime;
        public decimal RunTime;
        public decimal GoodCount;
        public decimal Availability;
        public decimal Performance;
        public decimal Quality;
        public decimal Oee;
    }
}
namespace Factorant.OEE.WPF.BL
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    //public partial class MainWindow : Window
    public class OeeCalculator
    {
        public OeeCalcModelOut CalculateOee(OeeCalcModelIn inbound)
        {
            OeeCalcModelOut returnValue = new OeeCalcModelOut();
            returnValue.PlannedProductionTime = _calculatePlannedProductionTime(inbound.ShiftLength, inbound.Breaks);
            returnValue.RunTime = _calculateRunTime(returnValue.PlannedProductionTime, inbound.StopTime);
            returnValue.GoodCount = _calculateGoodCount(inbound.RejectCount, inbound.TotalCount);
            returnValue.Availability = _calculateAvailability(returnValue.RunTime, returnValue.PlannedProductionTime);
            returnValue.Performance = _calculatePerformance(inbound.IdealCycleTime, inbound.TotalCount, returnValue.RunTime);
            returnValue.Quality = _calculateQuality(returnValue.GoodCount, inbound.TotalCount);
            returnValue.Oee = _calculateOee(returnValue.Availability, returnValue.Performance, returnValue.Quality);
            return returnValue;
        }

        private decimal _calculatePlannedProductionTime(decimal ShiftLength, decimal Breaks)
        {
            return ShiftLength - Breaks;
        }

        private decimal _calculateRunTime(decimal plannedProductionTime, decimal stopTime)
        {
            return plannedProductionTime - stopTime;
        }

        private decimal _calculateGoodCount(decimal rejectCount, decimal totalCount)
        {
            return totalCount - rejectCount;
        }

        private decimal _calculateAvailability(decimal runTime, decimal plannedProductionTime)
        {
            if (plannedProductionTime == 0)
                return 0;
            return runTime / plannedProductionTime;
        }

        private decimal _calculatePerformance(decimal idealCycleTime, decimal totalCount, decimal runTime)
        {
            if (runTime == 0)
                return 0;
            return (idealCycleTime * totalCount) / (runTime * 60);
        }

        private decimal _calculateQuality(decimal goodCount, decimal totalCount)
        {
            if (totalCount == 0)
                return 0;
            return goodCount / totalCount;
        }
        
        private decimal _calculateOee(decimal availability, decimal performance, decimal quality)
        {
            return availability * performance * quality;
        }

         //public MainWindow()
        // {
       //   InitializeComponent();
        // }
        
}
}

Code của bạn chỉ update trên giao diện thôi chứ binding không đúng.
Tham khảo đoạn này nhé.

  • Bạn thay đổi số thứ nhất và kiểm tra xem Tổng có đổi không?
  • Tiếp đó thay đổi số thứ hai và kiểm tra xem Tổng có đổi không?
  • Thử tìm điểm khác biệt giữa cách khai báo số thứ nhất và số thứ 2. và giải thích tại sao trong 2 trường hợp trên chỉ có 1 trường hợp tổng thay đổi kết quả.
  • Khi bạn giải thích được rồi, chúng ta tìm hiểu tiếp cách tiếp cận vấn đề của bạn.

#Xaml

<Window x:Class="Simplebinding.MainWindow"
        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:Simplebinding"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel Width="200" Margin="50">
            <TextBlock>So thu nhat</TextBlock>
            <TextBox Text="{Binding No1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <TextBlock>So thu hai</TextBlock>
            <TextBox Text="{Binding No2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <TextBlock>Tong</TextBlock>
            <TextBox Text="{Binding Sum, Mode=OneWay}" IsReadOnly="True"></TextBox>
        </StackPanel>
    </Grid>
</Window>

#Csharp

 /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public SimpleMath Formular { get; set; }
        public MainWindow()
        {
            Formular = new SimpleMath()
            {
                No1 = 0,
                No2 = 0
            };
            InitializeComponent();
            DataContext = Formular;
        }
    }

    public class SimpleMath : INotifyPropertyChanged
    {
        private int no1;

        public int No1
        {
            get { return no1; }
            set { 
                no1 = value;
                OnPropertyChanged("No1");
            }
        }

        private int no2;

        public int No2
        {
            get { return no2; }
            set { 
                no2 = value; 
                OnPropertyChanged("No2");
                OnPropertyChanged("Sum");
            }
        }
        public int Sum => No1 + No2;

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName()] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
2 Likes

cảm ơn anh nha, em sẽ tìm hiệu lại thật kỹ ạ.

chào anh Lộc em đã thấy có sự khác biệt ở cách khai báo No1 và No2 trong csharp rồi

 public int No1
        {
            get { return no1; }
            set
            {
                no1 = value;
                OnPropertyChanged("No1");
            }
        }

        private int no2;

        public int No2
        {
            get { return no2; }
            set
            {
                no2 = value;
                OnPropertyChanged("No2");
                OnPropertyChanged("Sum");
            }
        }

vì trong cổng truy cập get set no2 có khai báo hàm : OnPropertyChanged(“Sum”);
vì thế giá trị 2 thay đổi thì tổng sẽ thay đổi

Cái hàm đó không phải làm tổng thay đổi.
Nó chỉ gửi đi thông báo cái gì đó đã thay đổi thôi.

3 Likes

dạ nhưng khi em đổi hàm đó lên No1 thì khi No1 thay đổi tổng thay đổi theo ạ

Khi nó phát đi một thông báo PropertiyChanged lên UI với tên “Sum” thì quá trình Binding nhận biết được và thực hiện cập nhật dữ liệu của Sum.

Để thực hiện lấy lại giá trị của Sum thì nó chạy vào khối get của Sum nên phép cộng của Sum được thực hiện.

Nếu không binding, Sum không thay đổi.

3 Likes

vâng ạ, em hiểu rồi vậy vấn đề của em giờ nên đi hướng nào ạ !

  1. Trước tiên implement 2 models của bạn OeeCalcModelInOeeCalcModelOut kế thừa interface INotifyPropertyChanged. Nếu có thể thì gom nó vào 1 class.
  2. Nhớ cái nào là read/write cái nào là read-only. và cái nào phụ thuộc cái nào.
    Thuộc tính readonly có thể khai báo
 public int Sum => No1 + No2;
 public int Sum {
    get {
        return No1 + No2;
    }
 }
 public int Sum => AMethodReturnInt(); 

Khi công thức tính toán của bạn phức tạp có thể chọn cách số 3
3. Binding to View. khi binding, cái nào có thể nhập thay đổi giá trị để Mode là TwoWay, cái nào phụ thuộc vào thằng khác để là OneWave.
4. Nhớ khai báo data context trong hàm public MainWindow().
5. Trong này Textbox mình có để UpdateSourceTrigger=PropertyChange khi thay đổi text thì kq update luôn. Nếu không có đoạn này, text chỉ thay đổi khi textbox lost focus.
6. Push code lên github thay vì post dài dòng trên này. Rồi thảo luận tiếp. Có thể còn vài vấn đề nhỏ phát sinh.
7. tìm hiểu thêm cơ chế của nó https://docs.microsoft.com/en-us/dotnet/desktop-wpf/data/data-binding-overview
Mô hình này có nhiều framework sử dụng không riêng gì WPF, nên việc hiểu các nguyên tắc (không phải syntax) của nó, giúp bạn dễ tiếp cận hơn với framework khác.

3 Likes

anh ơi em làm theo cách trên nhưng khi phép tính có dấu chia nó không thực hiện được ạ, còn chổ đó thôi ?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Simplebinding
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    /// 
    public partial class MainWindow : Window
    {
        public SimpleMath Formular { get; set; }
        public MainWindow()
        {
            Formular = new SimpleMath()
            {
                No1 = 0,
                No2 = 0,
                No3 = 0,
                No4 = 0,
                No5 = 0,
                No6 = 0,
            };
            InitializeComponent();
            DataContext = Formular;
        }
    }

    public class SimpleMath : INotifyPropertyChanged
    {
        private int no1;

        public int No1
        {
            get { return no1; }
            set
            {
                no1 = value;
                OnPropertyChanged("No1");
                OnPropertyChanged("A");
                OnPropertyChanged("B");
                OnPropertyChanged("C");
                OnPropertyChanged("D");
                OnPropertyChanged("E");
                OnPropertyChanged("F");
                OnPropertyChanged("G");
            }
        }

        private int no2;
        public int No2
        {
            get { return no2; }
            set
            {
                no2 = value;
                OnPropertyChanged("No2");
                
                OnPropertyChanged("A");
                OnPropertyChanged("B");
                OnPropertyChanged("C");
                OnPropertyChanged("D");
                OnPropertyChanged("E");
                OnPropertyChanged("F");
                OnPropertyChanged("G");
           


            }
        }
        private int no3;
        public int No3
        {
            get { return no3; }
            set
            {
                no3 = value;
                OnPropertyChanged("No3");
            
                OnPropertyChanged("A");
                OnPropertyChanged("B");
                OnPropertyChanged("C");
                OnPropertyChanged("D");
                OnPropertyChanged("E");
                OnPropertyChanged("F");
                OnPropertyChanged("G");


            }
        }
        private int no4;
        public int No4
        {
            get { return no4; }
            set
            {
                no4 = value;
                OnPropertyChanged("No4");
              
                OnPropertyChanged("A");
                OnPropertyChanged("B");
                OnPropertyChanged("C");
                OnPropertyChanged("D");
                OnPropertyChanged("E");
                OnPropertyChanged("F");
                OnPropertyChanged("G");


            }
        }
        private int no5;
        public int No5
        {
            get { return no5; }
            set
            {
                no5 = value;
                OnPropertyChanged("No5");
              
                OnPropertyChanged("A");
                OnPropertyChanged("B");
                OnPropertyChanged("C");
                OnPropertyChanged("D");
                OnPropertyChanged("E");
                OnPropertyChanged("F");
                OnPropertyChanged("G");


            }
        }
        private int no6;
        public int No6
        {
            get { return no6; }
            set
            {
                no6 = value;
                OnPropertyChanged("No6");
                
                OnPropertyChanged("A");
                OnPropertyChanged("B");
                OnPropertyChanged("C");
                OnPropertyChanged("D");
                OnPropertyChanged("E");
                OnPropertyChanged("F");
                OnPropertyChanged("G");



            }
        }
       public int A => No1 - No2;
        
       public int B => A - No3;
       
       public int C => No5 - No6;
       
     // public int D => B / A; không thực hiện được ??
        
      // public int E => (No4 * No5) / (B*60); không thực hiện được ?? 
      
      // public int F => C / No5 ; không thực hiện được ??
        
        //public int G => D * E * F ; không thực hiện được ??
    

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName()] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Chưa xét trường hợp A = 0; Lỗi này rất cơ bản

 public double D => A == 0 ? double.NAN : B / A; 
3 Likes

Báo lỗi đang cố chia cho số 0 ạ

dạ em làm được rồi anh!!! nhưng còn 1 vài kết quả chưa ra đúng công thức để em xem lại, với làm thế nào để kết quả đó ra là % anh hệ decimal
như 3 chỉ số này là % hết ạ

Availability;
decimal Performance;
decimal Quality;
decimal Oee;

như ở kết quả
public double D => A == 0 ? double.NAN : B / A;
kết quả ra là số % 0,8888 nó sẽ làm tròn thành 0 nên em muốn đổi lại là 88,8 % thì làm sao anh Lộc ?

Các số A,B,C đều là int (số nguyên thì phép chia làm sao có dấu chấm động )?

3 Likes

Cách đơn giản nhất.

public string Performance => $"{a/b:p2}"; 
//Nhớ convert a và b sang double vì a và b là int thì 7/2 = 3 chứ không phải 3.5

Cách tổng quát hơn dùng IConverter

    public class DoubleToPercentstringConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            double doubleValue = (double)value;
            if (double.IsNaN(doubleValue))
            {
                return "-";
            }
            return $"{doubleValue:p2}";
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
 <Window.Resources>
        <local:DoubleToPercentstringConverter x:Key="DoubleToPercent"></local:DoubleToPercentstringConverter>
    </Window.Resources>
    <Grid>
        <StackPanel Width="200" Margin="50">
            <TextBlock>So thu nhat</TextBlock>
            <TextBox Text="{Binding No1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <TextBlock>So thu hai</TextBlock>
            <TextBox Text="{Binding No2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <TextBlock>Tong</TextBlock>
            <TextBox Text="{Binding Sum, Mode=OneWay, FallbackValue=NAN, Converter={StaticResource DoubleToPercent}}" IsReadOnly="True">
            </TextBox>
        </StackPanel>
    </Grid>
3 Likes

dạ cám ơn các anh nhiều ạ !!!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?