【发布时间】:2026-02-05 23:25:01
【问题描述】:
我花了好几个小时试图解决这个问题:
我有一个名为NewMazeGrid 的用户自定义网格控件,我想将它用作MainWindow 中的控件。 MainWindow 包含 MazeViewModel(mazeVM 成员)。
当属性MazeViewModel:MySingleplay 发生变化时,我正在尝试设置网格的值。
(我正在使用INotifyPropertyChanged,它工作得很好。我想,问题出在最终绑定中)
代码:
这是MazeViewModel:MySingleplay getter 的属性:
public string MySingleplay
{
get
{
if (myModel.MySingleplay == null)
{
return "";
} else
{
return myModel.MySingleplay.ToString();//works perfect
}
}
}
这是NewMazeGrid.xaml.cs:
namespace VisualClient.View.controls
{
public partial class NewMazeGrid : UserControl
{
private MazePresentation myMaze;
private string order; //dont really use it
//Register Dependency Property
public static readonly DependencyProperty orderDependency =
DependencyProperty.Register("Order", typeof(string), typeof(NewMazeGrid));
public NewMazeGrid()
{
myMaze = new MazePresentation();
InitializeComponent();
DataContext = this;
lst.ItemsSource = myMaze.MazePuzzleLists;
}
public string Order
{
get
{
return (string)GetValue(orderDependency);
}
set
{
SetValue(orderDependency, value);
myMaze.setPresentation(value); //(parsing string into matrix)
}
}
}
}
这是MainWindow.xaml.cs:
public partial class MainWindow : Window
{
private MazeViewModel mazeVM;
public MainWindow()
{
InitializeComponent();
mazeVM = new MazeViewModel(new ClientMazeModel(new TCPClientConnection()));
DataContext = mazeVM;
mazeVM.connectToServer();
}
private void bu_Click(object sender, RoutedEventArgs e)
{
bool isC = mazeVM.isConnected();
mazeVM.openSingleplayGame("NewMaze");//works perfect
}
这是MainWindow.xaml:
<Window x:Class="VisualClient.View.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:Controls ="clr-namespace:VisualClient.View.controls"
xmlns:vm ="clr-namespace:VisualClient.ViewModel"
xmlns:local="clr-namespace:VisualClient.View"
mc:Ignorable="d"
Title="Main Window" Height="350" Width="525" MinWidth="900" MinHeight="600">
<WrapPanel >
<Button Name ="bu" Content="Click_Me" Click="bu_Click"/>
<Grid Name="myGrid">
<Controls:NewMazeGrid Order="{Binding MySingleplay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</WrapPanel>
</Window>
我在绑定行收到此错误:值不能为空。
总而言之: 它在 ctor 中很好地初始化了窗口,但是当属性更改时,它不会进入 Order 属性设置器。因此我的网格永远不会改变。
在这种情况下,正确的绑定语法应该是什么?如何将其绑定到正确的属性?
【问题讨论】:
-
不确定绑定错误,但不知道为什么不调用你的 setter 看看here
-
谢谢!但仍然没有进入 MySingleplay 属性 getter
标签: c# wpf xaml mvvm data-binding