darthwillard
darthwillard

Reputation: 819

wpf property binding to a textblock in MVVM?

i have a text block that i'm trying to data bind to a property in my viewModel, i can't get it to update, here's code:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        FurnaceDataViewModel viewModel = new FurnaceDataViewModel();
        InitializeComponent();
    }
}

.

class FurnaceDataViewModel: ObservableObject
{
    public FurnaceDataModel dataModel = new FurnaceDataModel();
    public SerialPort serialPort = new SerialPort();

    public FurnaceDataViewModel()
    {            
        serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
        try
        {
            if (serialPort.IsOpen != true)
                serialPort.Close();
            serialPort.Open();
            serialPort.DataReceived += new SerialDataReceivedEventHandler(serialReceivedData); 
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

    public void serialReceivedData(object sender, SerialDataReceivedEventArgs e)
    {
        dataModel.IncomingMessage = serialPort.ReadExisting();            
    }
}

.

class FurnaceDataModel: ObservableObject
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string incomingMessage;

    public string IncomingMessage
    {
        get { return incomingMessage; }
        set
        {
            incomingMessage = value;
            OnPropertyChanged("IncomingMessage");
        }
    }
}

.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:FurnaceData" x:Class="FurnaceData.MainWindow"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <TextBlock x:Name="tbkMain" HorizontalAlignment="Left" Height="292" Margin="10,10,0,0" TextWrapping="Wrap" Text="{Binding dataModel.IncomingMessage}" VerticalAlignment="Top" Width="489"/>
</Grid>

and how do i text wrap the text block when the data gets binding? like += kinda thing?

Upvotes: 1

Views: 1812

Answers (1)

Jay
Jay

Reputation: 10118

I think you need to set your datacontext or set up a objectDataProvider.

In your constructor, try adding the line

DataContext = viewModel;

And change your field to a property

public class FurnaceDataViewModel
{
    public FurnaceDataModel dataModel { get; set; }

And you should see your text wrapping, but it's hard to see when you have your textblock code set to an absolute size... try this to see it wrap

 <TextBlock x:Name="tbkMain" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  Margin="10,10,0,0" TextWrapping="Wrap" 
               Text="{Binding Path=dataModel.IncomingMessage}" />

Upvotes: 1

Related Questions