C# WPF量规中的动态值
我是WPF和C的新手,但多亏了这个社区,我很快就学会了。我已经试着在我的项目中实现一个来自实时图表的角度测量仪。它只需要一个绑定值,其余的值都是固定的,就像这个例子:() 有人能帮我修改代码,使其动态化吗?我希望将它们绑定到数据库中的值,或者根据我的目标计算它们,而不是在FromValue:ToValue:。所有建议都非常受欢迎 以下是我迄今为止所做的工作: XAML: 我希望实现但不起作用的目标(我知道它没有起作用的机会,但我希望有人能帮助我正确地重写它): XAML:C# WPF量规中的动态值,c#,wpf,gauge,livecharts,C#,Wpf,Gauge,Livecharts,我是WPF和C的新手,但多亏了这个社区,我很快就学会了。我已经试着在我的项目中实现一个来自实时图表的角度测量仪。它只需要一个绑定值,其余的值都是固定的,就像这个例子:() 有人能帮我修改代码,使其动态化吗?我希望将它们绑定到数据库中的值,或者根据我的目标计算它们,而不是在FromValue:ToValue:。所有建议都非常受欢迎 以下是我迄今为止所做的工作: XAML: 我希望实现但不起作用的目标(我知道它没有起作用的机会,但我希望有人能帮助我正确地重写它): XAML: 我不熟悉这个特定的库,
我不熟悉这个特定的库,但是查看一下显示FromValue和ToValue属性是依赖属性,因此可以将它们绑定到一个值。看起来可能只是因为您没有将值属性实现为
dependencProperty
尝试实现类似以下内容的属性:
public static readonly DependencyProperty Value25Property = DependencyProperty.Register(
"Value25",
typeof(double),
typeof(MainWindow));
public double Value25
{
get { return (double) GetValue(Value25Property); }
set { SetValue(Value25Property, value); }
}
你的问题很广泛,特别是缺乏一个好的答案。但是您似乎没有在
main窗口
类中实现INotifyPropertyChanged
。您最好为这些属性创建一个单独的视图模型类,但是如果您希望绑定反映在绑定初始化后设置的值,则属性所属的类需要实现INotifyPropertyChanged
。您好,Peter!很抱歉,我没能遵循指导方针。第一个示例是可验证且有效的。然后,第二种方法可以用来翻译我想要实现的目标。我不知道该怎么写,我指望像你这样的人能帮助我,他知识渊博得多。谢谢您的及时建议。您的问题与特殊仪表或动态图表无关。为了提出一个好的堆栈溢出问题,您需要提供一个代码示例,该示例将基本问题提取为演示问题所需的最少代码量。或者,您可以阅读许多关于WPF和数据绑定的教程中的任何一个。那也行。如果我的问题对你来说不够好,我很抱歉。为了使代码最小化,我已经去掉了很多代码。我正在演示什么有效,什么无效。阅读教程对这个问题没有帮助,我已经做了。我知道你想在将来帮助我写出更好的问题和例子,但如果你能像这个社区的其他成员一样帮我写这个例子,我将不胜感激。我同意你的观点,这可能不是最好的例子,但我不知道如何更好地阐述它。干杯源属性不必是dependencProperty
,绑定才能工作。@PeterDuniho源属性不必是dependencProperty
,初始绑定才能工作。在这种情况下,所有属性的默认值均为0,并且它们将被显式设置。因此,它们需要实现为depenceyproperty
,或者OP必须实现INotifyPropertyChanged
@Jason:被绑定的属性可以实现为依赖属性,但由于它们不是窗口的属性,也不需要成为绑定的目标,这样做没有意义,而且,向WPF新手推荐这样做会使他们的场景过于复杂,没有什么好的理由。他们所需要的只是一个合适的视图模型,就像任何好的WPF程序一样。@PeterDuniho我理解你关于视图模型的观点,并同意在开发WPF应用程序时,这是“正确”的方法,但深入解释MVVM似乎超出了问题的范围。OP有一个关于将AngularSection
properties绑定到main窗口上的属性的特定问题
@Jason:“深入解释MVVM似乎超出了问题的范围”——深入解释MVVM正是问题所要求的,这就是为什么它太宽泛的原因。这真的不应该被回答,伊姆霍。如果你要回答一个太宽泛的问题,你需要正确地回答。不要教他错误的东西,使OP的困惑更加复杂。
namespace Car_App
public partial class MainWindow : MetroWindow
{
private double _value;
public MainWindow()
{
InitializeComponent();
string connectionString = "datasource=xx.xx.xxx.xxx;port=xxxx;username=xxxx;password=xxx";
string sMonth = DateTime.Now.ToString("MM");
string sYear = DateTime.Now.ToString("yyyy");
MySqlConnection connection = new MySqlConnection(connectionString);
MySqlCommand cmd = new MySqlCommand("Select * from Table.MyTable where MONTH(Date) = @sMonth AND YEAR(Date) = @sYear", connection);
MySqlCommand sCarCT = new MySqlCommand("Select TotalCarCount from Table.CarTotals where sMonth = @sMonth", connection);
MySqlCommand target = new MySqlCommand("Select Target from Table.Targets where Location = 'xxxxx'", connection);
try
{
connection.Open();
cmd.Parameters.Add(new MySqlParameter("sMonth", sMonth));
cmd.Parameters.Add(new MySqlParameter("sYear", sYear));
sCarCT.Parameters.Add(new MySqlParameter("sMonth", sMonth));
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
dtGrid.DataContext = dt;
Value = double.Parse(sCarCT.ExecuteScalar().ToString());
DataContext = this;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
connection.Close();
}
public double Value
{
get { return _value; }
set
{
_value = value;
}
}
}
<lvc:AngularGauge Value="{Binding Value}" FromValue="0" Grid.Column="1" ToValue="{Binding ValueT}"
LabelsStep="50" TicksStep="25" Wedge="300"
TicksForeground="White" Foreground="WhiteSmoke"
FontWeight="Bold" FontSize="16"
SectionsInnerRadius=".6" Width="310">
<lvc:AngularGauge.Sections>
<lvc:AngularSection FromValue="0" ToValue="{Binding Value25}" Fill="#dd5143"/>
<lvc:AngularSection FromValue="{Binding Value25}" ToValue="{Binding Value50}" Fill="#e68523"/>
<lvc:AngularSection FromValue="{Binding Value50}" ToValue="{Binding Value75}" Fill="#edb220"/>
<lvc:AngularSection FromValue="{Binding Value75}" ToValue="{Binding ValueT}" Fill="#7cb82f"/>
</lvc:AngularGauge.Sections>
</lvc:AngularGauge>
namespace Car_App
public partial class MainWindow : MetroWindow
{
private double _value;
public MainWindow()
{
InitializeComponent();
string connectionString = "datasource=xx.xx.xxx.xxx;port=xxxx;username=xxxx;password=xxx";
string sMonth = DateTime.Now.ToString("MM");
string sYear = DateTime.Now.ToString("yyyy");
MySqlConnection connection = new MySqlConnection(connectionString);
MySqlCommand cmd = new MySqlCommand("Select * from Table.Car where MONTH(Date) = @sMonth AND YEAR(Date) = @sYear", connection);
MySqlCommand sCarCT = new MySqlCommand("Select TotalCarCount from Table.CarTotals where sMonth = @sMonth", connection);
MySqlCommand target = new MySqlCommand("Select Target from Table.Targets where Location = 'xxxxx'", connection);
try
{
connection.Open();
cmd.Parameters.Add(new MySqlParameter("sMonth", sMonth));
cmd.Parameters.Add(new MySqlParameter("sYear", sYear));
sCR.Parameters.Add(new MySqlParameter("sMonth", sMonth));
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
dtGrid.DataContext = dt;
Value = double.Parse(sCarCT.ExecuteScalar().ToString());
ValueT = double.Parse(target.ExecuteScalar().ToString());
Value75 = ValueT - ValueT*25%;
Value50 = ValueT - ValueT*50%;
Value25 = ValueT - ValueT*75%;
DataContext = this.Value, this.ValuT, this.Value25, this.Value50, this.Value75;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
connection.Close();
}
public double Value
{
get { return _value; }
set
{
_value = value;
}
}
public double ValueT
{
get { return _value; }
set
{
_value = value;
}
}
public double Value75
{
get { return _value; }
set
{
_value = value;
}
}
public double Value50
{
get { return _value; }
set
{
_value = value;
}
}
public double Value25
{
get { return _value; }
set
{
_value = value;
}
}
}
public static readonly DependencyProperty Value25Property = DependencyProperty.Register(
"Value25",
typeof(double),
typeof(MainWindow));
public double Value25
{
get { return (double) GetValue(Value25Property); }
set { SetValue(Value25Property, value); }
}