gpt4 book ai didi

c# - 如何在 WPF 中正确绑定(bind)我的模型?

转载 作者:行者123 更新时间:2023-12-03 10:35:30 24 4
gpt4 key购买 nike

我有一个名为 ViewModel 的类,它实现了 INotifyPropertyChanged 接口(interface)。在我的 XAML 中,我有 3 个文本框,它们的绑定(bind)属性与我的 ViewModel 属性匹配:

已订购测试
已完成测试
测试剩余

我的代码隐藏中有一个 PropertyChanged 事件处理程序。我有一个附加到 XAML 窗口的上下文“MyContext”。我不确定为什么当我更改 TestsOrdered 和 TestsCompleted 值时 UI 没有更新。我希望 UI 在我从文本框中跳出时更新,但直到我从 TestsRemaining 文本框中跳出时才更新。我的设计缺陷在哪里?

public partial class MainWindow : Window
{
public ViewModel vm;

public MainWindow()
{
InitializeComponent();
vm = new ViewModel();
//ct = new CompletionTime();
//ct.TestsOrdered = 8000;

vm.Name = "John Doe";
vm.TestsCompleted = 0;
vm.TestsOrdered = 0;
vm.TestsRemaining = 0;

this.MyContext.DataContext = vm;
}

private void btnName_Click(object sender, RoutedEventArgs e)
{
vm.Name = "Joe";
}
}

public class ViewModel : INotifyPropertyChanged
{
private string name;
private int mTestsOrdered;
private int mTestsRemaining;
private int mTestsCompleted;

public string Name
{
get { name; }
set
{
if (name != value)
{
name = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
}
}


public int TestsOrdered
{
get { return mTestsOrdered; }
set
{
if (mTestsOrdered != value)
{
mTestsOrdered = value;
PropertyChanged(this, new PropertyChangedEventArgs("TestsOrdered"));
}
}
}


public int TestsCompleted
{
get { return mTestsCompleted; }
set
{
if (mTestsCompleted != value)
{
mTestsCompleted = value;
PropertyChanged(this, new PropertyChangedEventArgs("TestsCompleted"));
}
}
}


public int TestsRemaining
{
get { return TestsOrdered - TestsCompleted; }
set
{
if (mTestsRemaining != value)
{
mTestsRemaining = value;
PropertyChanged(this, new PropertyChangedEventArgs("TestsRemaining"));
}
}
}

public event PropertyChangedEventHandler PropertyChanged;
}

MyContext 是包含 ViewModel 对象的 DataContext。

XAML:
 <Grid Margin="-1,-9,1,9">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="244*"/>
<ColumnDefinition Width="251*"/>
</Grid.ColumnDefinitions>
<TextBox Width="100" HorizontalAlignment="Center" Margin="96.791,40,54,0" TextWrapping="Wrap" Text="{Binding Path=Name}" VerticalAlignment="Top" Grid.Column="1"/>

<Button x:Name="btnName" Content="Button" HorizontalAlignment="Left" Margin="171,210,0,0" VerticalAlignment="Top" Width="148" Height="47" Click="btnName_Click" Grid.ColumnSpan="2"/>
<TextBox Grid.Column="0" HorizontalAlignment="Left" Height="23" Margin="97,84,0,0" TextWrapping="Wrap" Text="{Binding Path=TestsOrdered}" VerticalAlignment="Top" Width="120"/>
<TextBox Grid.Column="0" HorizontalAlignment="Left" Height="23" Margin="97,112,0,0" TextWrapping="Wrap" Text="{Binding Path=TestsCompleted}" VerticalAlignment="Top" Width="120"/>
<TextBox Grid.Column="0" HorizontalAlignment="Left" Height="23" Margin="97,140,0,0" TextWrapping="Wrap" Text="{Binding Path=TestsRemaining}" VerticalAlignment="Top" Width="120"/>

</Grid>

最佳答案

您的绑定(bind)和属性已正确编写。然而,问题在于您将 viewmodel 实例分配给 Window。 .您需要在属性 DataContext 上设置 View 模型的实例为绑定(bind)工作。像这样:

 public MainWindow()
{
InitializeComponent();
vm = new ViewModel();
//ct = new CompletionTime();
//ct.TestsOrdered = 8000;

vm.Name = "John Doe";
vm.TestsCompleted = 0;
vm.TestsOrdered = 0;
vm.TestsRemaining = 0;

//this.MyContext.DataContext = vm;
this.DataContext = vm; // <-- Like so
}

原因是绑定(bind)的工作方式。如果没有提供其他来源( SourceRelativeSourceElementNameBinding 属性),绑定(bind)将使用 DataContext FrameworkElement 的属性(property)他们被分配到。在你的情况下 TextBox .

当您设置 DataContext Window 的属性,然后它的所有子对象都继承该对象实例,以及它们的子对象,依此类推。

尝试更改您的 ViewModel 分配,您将看到绑定(bind)工作。

//干杯

关于c# - 如何在 WPF 中正确绑定(bind)我的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31091796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com