我需要一個系結到 ClassA 的 TextBox,顯示來自 ClassB 的兩個物件的變數之和。如果我嘗試手動編輯 TextBox,它只會更改其值。我的問題是我不知道如何在 ClassA 中實作一個方法,如果 ClassB 中的變數發生更改,該方法會監聽。我試圖讓 ClassB 成為 ClassA 的子類,但后來我得到一個 StackOverflowException ,所以這不起作用。
主視窗.xaml
<Window x:Class="INPCTest.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:INPCTest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:ClassA/>
</Window.DataContext>
<Grid x:Name="BaseGrid" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBox x:Name="TextBoxClassA" Grid.Row="1" Grid.Column="1" Text="{Binding Sum, UpdateSourceTrigger=PropertyChanged}" />
<TextBox x:Name="TextBox1ClassB" Grid.Row="2" Grid.Column="1" Text="{Binding MyClassB1.Var, UpdateSourceTrigger=PropertyChanged}" />
<TextBox x:Name="TextBox2ClassB" Grid.Row="2" Grid.Column="2" Text="{Binding MyClassB2.Var, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</Window>
類A.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace INPCTest
{
public class ClassA : ObservableObject
{
private decimal _sum;
public decimal Sum
{
get { _sum = MyClassB1.Var MyClassB2.Var; return _sum; }
set { _sum = value; OnPropertyChanged();}
}
public ClassB MyClassB1 { get; set; } = new ClassB(1);
public ClassB MyClassB2 { get; set; } = new ClassB(2);
}
}
類B.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace INPCTest
{
public class ClassB : ObservableObject
{
private decimal _var;
public ClassB(decimal var)
{
_var = var;
}
public decimal Var
{
get { return _var; }
set { _var = value; OnPropertyChanged();}
}
}
}
ObservableObject.cs
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace INPCTest
{
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyname = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
}
}
}
uj5u.com熱心網友回復:
您可以使用來自Action.
A類:
public class ClassA : ObservableObject
{
private decimal _sum;
public ClassA()
{
MyClassB1 = new ClassB(1) {OnVarChanged = OnVarChange};
MyClassB2 = new ClassB(2) {OnVarChanged = OnVarChange};
}
public decimal Sum
{
get { _sum = MyClassB1.Var MyClassB2.Var; return _sum; }
set { _sum = value; OnPropertyChanged(); }
}
public ClassB MyClassB1 { get; set; }
public ClassB MyClassB2 { get; set; }
private void OnVarChange() => OnPropertyChanged(nameof(Sum));
}
B類:
public class ClassB : ObservableObject
{
private decimal _var;
public ClassB(decimal var)
{
_var = var;
}
public Action OnVarChanged { get; set; }
public decimal Var
{
get { return _var; }
set
{
_var = value;
OnPropertyChanged();
OnVarChanged?.Invoke();
}
}
}
uj5u.com熱心網友回復:
使用和 WPF監聽ClassA它的每個ClassB物件。當任何一個上的屬性發生變化時,都可以為其屬性引發事件。例如,您可以為 A 類撰寫一個建構式來執行此操作INotifyPropertyChangedPropertyChangedEventManagerVarClassAPropertyChangedSum
public ClassA()
{
PropertyChangedEventManager.AddHandler(
MyClassB1,
(_,_) => OnPropertyChanged(nameof(Sum)),
nameof(ClassB.Var));
PropertyChangedEventManager.AddHandler(
MyClassB2,
(_,_) => OnPropertyChanged(nameof(Sum)),
nameof(ClassB.Var));
}
但是有一個問題:你有一個 ClassA.Sum. Sum如果應該是每兩個ClassB.Var值的加法,那怎么可能起作用?你怎么去另一個方向?
每次有人設定時,ClassA.Sum您都必須以某種方式在兩者之間劃分新的 Sum ,ClassB或者下次有人呼叫 getter 時,值會變回來。
我不知道這將如何運作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/449947.html
上一篇:無法在switch陳述句中列印出不同情況下的串列物件
下一篇:WPF在2個復選框之間切換
