gpt4 book ai didi

c# - 在 mainviewmodel 上寻找 MVVM 文本 block 绑定(bind)的指导

转载 作者:行者123 更新时间:2023-12-03 10:13:36 25 4
gpt4 key购买 nike

我有一个正在开发的与股票相关的应用程序。

它有点像 Josh Smith 的 MVVM 演示应用程序,并添加了一些内容。

我有一个名为 ShortQuote.cs 的数据模型
它有一个 View 模型 ShortQuoteViewModel ,但 ShortQuoteViewModel 目前没有使用。

我有一个 ShortQuoteRepository它创建了 ShortQuote 类型的对象列表从 XML 数据文件中获取。 ShortQuoteRepository当用户单击主窗口左 Pane 上的命令时,列表出现在选项卡中。

我在 MainWindow 上有一个组合框其中有一个股票代码列表。当用户选择这些股票代码之一时,我想从 ShortQuoteRepository 获取 StockQuote 对象之一(如果该股票存在的话)并将其内容显示在 MainWindow 顶部的 TextBlocks 中看法。

我可以让它工作的唯一方法是在 MainWindowViewModel 上公开"new"属性。它们是 ShortQuote 数据模型上的属性的镜像,然后一旦我得到 ShortQuote ShortQuoteRepository 中的对象我设置了MainWindowViewModel的"new"属性等于检索到的对象的属性。我将 TextBlock 绑定(bind)到 MainWindowViewModel的"new"属性,它的工作原理。

我觉得这是一个“黑客”,并且有一种“更好”的方式来实现这一点,而不必在 MainWindowViewModel 上创建"new"属性,并且正在请求一些关于如何在更多直接使用 XAML 或 XAML 和 MainWindowViewModel 的组合的方法不需要创建这些"new"属性的代码。

谁能帮我?

最佳答案

还要使您的 ShortQuote 成为 ViewModel(或者至少是 ObservableObject,如果您使用的是 MVVM Light)。然后可以绑定(bind)SelectedItemShortQuote View 模型上的属性(将其标记为 TwoWay)。然后您的 View 可以引用 SelectedItem因为它需要。

将此添加到 ShortQuoteViewModel.cs

private ShortQuote _selectedQuote;

public ShortQuote SelectedQuote
{
get { return _selectedQuote; }
set
{
if(value != _selectedQuote)
{
_selectedQuote = value;
RaisePropertyChanged("SelectedQuote");
}
}
}

XAML:
<ListBox ItemsSource="{Binding Quotes}" SelectedItem={Binding SelectedQuote, Mode=TwoWay}"/>

<TextBlock Text="{Binding SelectedQuote.Ticker}"/>

您还必须更改您的 ShortQuote类(可能在 ShortQuote.cs 中)来实现 INotifyPropertyChanged ,或者通过显式实现 INPC,或者通过从 ViewModel 或 ObservableObject 继承(如果使用 MVVM Light。你没有指定,但它很流行,如果你不使用它,你应该考虑这样做)。

编辑这是一个工作示例:

XAML:
<Window x:Class="StockQuoteExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="24"/>
<RowDefinition/>
</Grid.RowDefinitions>

<TextBlock>
<Run Text="Company Name: "/>
<Run Text="{Binding SelectedTicker.Ticker}"/>
<Run Text=" Symbol: "/>
<Run Text="{Binding SelectedTicker.StockName}"/>
<Run Text=" Tick Price: "/>
<Run Text="{Binding SelectedTicker.TickPrice}"/>
</TextBlock>

<ListBox Grid.Row="1" Margin="10" ItemsSource="{Binding StockQuotes}" SelectedItem="{Binding SelectedTicker, Mode=TwoWay}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Width="120" Text="{Binding Ticker}"/>
<TextBlock Width="120" Margin="5,0,5,0" Text="{Binding StockName}"/>
<TextBlock Width="120" Text="{Binding TickPrice}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>

代码隐藏:
using System.Windows;
using StockQuoteExample.ViewModel;

namespace StockQuoteExample
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

this.DataContext = new StockQuoteViewModel();
}
}
}

View 模型:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using StockQuoteExample.DataModel;

namespace StockQuoteExample.ViewModel
{
class StockQuoteViewModel : INotifyPropertyChanged
{

public ObservableCollection<StockQuote> StockQuotes { get; set; }

private StockQuote _selectedTicker;

public StockQuote SelectedTicker
{
get { return _selectedTicker; }
set
{
if (value != _selectedTicker)
{
_selectedTicker = value;
OnPropertyChanged("SelectedTicker");
}
}
}


public StockQuoteViewModel()
{
StockQuotes = new ObservableCollection<StockQuote>()
{
new StockQuote() {StockName = "Microsoft", TickPrice = 150m, Ticker = "MSFT"},
new StockQuote() {StockName = "Apple", TickPrice = 600m, Ticker = "AAPL"}
};
}




public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

public event PropertyChangedEventHandler PropertyChanged;

}
}

数据模型:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace StockQuoteExample.DataModel
{
public class StockQuote : INotifyPropertyChanged
{

private string _ticker;

public string Ticker
{
get { return _ticker; }
set
{
if (value != _ticker)
{
_ticker = value;
OnPropertyChanged("Ticker");
}
}
}

private string _stockName;

public string StockName
{
get { return _stockName; }
set
{
if (value != _stockName)
{
_stockName = value;
OnPropertyChanged("StockName");
}
}
}

private decimal _tickPrice;

public decimal TickPrice
{
get { return _tickPrice; }
set
{
if (value != _tickPrice)
{
_tickPrice = value;
OnPropertyChanged("TickPrice");
}
}
}




public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

public event PropertyChangedEventHandler PropertyChanged;
}
}

关于c# - 在 mainviewmodel 上寻找 MVVM 文本 block 绑定(bind)的指导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9863796/

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