【发布时间】:2019-02-15 14:34:56
【问题描述】:
我正在使用 Caliburn Micro 开发一个 WPF (MVVM) 应用程序,我使用了属性中应驻留在 VM 中的标准措辞,在我的应用程序中,我有 3 个文本框和一个数据网格,我想要的是无论何时使用选择文本框必须显示所选值的任何行(仅限单选!),文本框将根据列显示不同的数据。我也为相同的结构建模,问题是我已经根据 CM 的命名约定将控件的 x:name 设置为属性,现在选择是从模型中获取的,所以如何设置本地 VM 属性来自 Model 属性。
我的模特:
public class PackageModel
{
public int id { get; set; }
public string sessionName { get; set; }
public int sessionInMins { get; set; }
public int sessionAmount { get; set; }
public bool isActive { get; set; }
}
我的视图模型:
private string _packName;
public string PackageName
{
get { return _packName; }
set
{
_packName = value;
NotifyOfPropertyChange(() => PackageName);
}
}
private int _amount;
public int Amount
{
get { return _amount; }
set {
_amount = value;
NotifyOfPropertyChange(() => Amount);
}
}
private int _mins;
public int Mins
{
get { return _mins; }
set {
_mins = value;
NotifyOfPropertyChange(() => Mins);
}
}
private bool _isActive;
public bool IsPackageActive
{
get { return _isActive; }
set {
_isActive = value;
NotifyOfPropertyChange(() => IsPackageActive);
}
}
private List<PackageModel> _packageList;
public List<PackageModel> PackageList
{
get { return _packageList; }
set
{
_packageList = value;
NotifyOfPropertyChange(() => PackageList);
}
}
private PackageModel _selectedPackage;
public PackageModel SelectedPackage
{
get
{
return _selectedPackage;
}
set
{
_selectedPackage = value;
NotifyOfPropertyChange(() => SelectedPackage);
}
}
}
我的观点:
<!--ROW 1-->
<TextBox
x:Name="PackageName"
Width="210"
Margin="5 5"
Controls:TextBoxHelper.Watermark="Package Name"
Controls:TextBoxHelper.ClearTextButton="True"
HorizontalAlignment="Left"
Grid.Row="0"
Grid.Column="0"/>
<!--ROW 2-->
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal">
<TextBox
x:Name="Mins"
Width="100"
Margin="5 5"
Controls:TextBoxHelper.Watermark="Min(s)"
Controls:TextBoxHelper.ClearTextButton="True"/>
<TextBox Width="100"
x:Name="Amount"
Margin="5 5"
Controls:TextBoxHelper.Watermark="Amount"
Controls:TextBoxHelper.ClearTextButton="True"/>
<CheckBox
x:Name="IsPackageActive"
Margin="5 5"
Content="Is Active?"
IsChecked="{Binding SelectedPackage.isActive}"/>
</StackPanel>
<!--ROW 3-->
<DataGrid x:Name="PackageList"
SelectedItem="{Binding SelectedPackage, Mode=TwoWay}"
Grid.Row="2"
Grid.ColumnSpan="1"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserSortColumns="False"
CanUserReorderColumns="False"
CanUserResizeRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding id}" Visibility="Hidden" IsReadOnly="True"/>
<DataGridTextColumn Header="Name" Binding="{Binding sessionName}" Width="120" IsReadOnly="True"/>
<DataGridTextColumn Header="Min(s)" Binding="{Binding sessionInMins}" IsReadOnly="True"/>
<DataGridTextColumn Header="Amount" Binding="{Binding sessionAmount}" IsReadOnly="True"/>
<DataGridCheckBoxColumn IsReadOnly="True" Header="Is Active?" Binding="{Binding isActive}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
如果我遵循任何错误的标准或设置属性的错误方式,请提出建议。
【问题讨论】:
-
能否请您也显示您的 xaml 代码?也许你必须设置 DataContext。
-
您是否从后面的代码中绑定了您的项目源?在 Xaml 中缺少将 itemsource 绑定到列表的部分。还将 INotifyPropertyChanged 实现为 Model 并使 TwoWay 绑定或 OneWay 取决于您的需要。如果您需要完整的答案,请告知
-
@NhanPhan DataContext 由 CaliburnMicro 自动设置,命名约定。
-
@Kaspar :我考虑过将 INotifyPropertyChanged 实现为模型,但我看到很多人有自己的方式,有人说 VM 应该有其他人说模型应该有的接口,我不知道是哪个方法是正确的,如果我在 Model 中实现它,我猜我们不需要那些 VM 本地属性。如果你能分享一个对我来说很有意义的例子,比如 newbee
-
我可以做这个例子,但是没有 CaliburnMicro(纯 WPF + MVVM),可以吗?我对微约定不是很熟悉。根据 VM 或 M 是否应该实现 INotifyPropertyChanged,这取决于。 stack-discussion
标签: c# wpf mvvm data-binding caliburn.micro