Search code examples
.netwpfxamlmvvmstatusbar

How to set custom layout grid position to StatusBarItem programmatically?


I want a dynamic status bar in my project

So I set the ItemSource to Binding

<StatusBar ItemsSource="{Binding StatusBarItemsSource}" DockPanel.Dock="Bottom" >

And created a BindingList in my main view model

public static BindingList<StatusBarItem> StatusBarItemsSource { get; set; }

On the initialization I add my logo to the bottom right

StatusBarItem logo = new StatusBarItem
{
    HorizontalAlignment = HorizontalAlignment.Right,
    Content = new Image
    {
        Source = new BitmapImage(new Uri("Logo.ico", UriKind.Relative)),
        Width = 16,
        Height = 16
    }
};
StatusBarItemsSource.Add(logo); 

StatusBar with logo on the right

So far so good, the logo appears in the right corner

BUT

If I want to add another StatusBarItem in another view to display a sum text for the view on the left, the logo shows up on the left too

MainViewModel:

public static void AddItemToStatusBar(Object content, HorizontalAlignment alignment = HorizontalAlignment.Stretch)
{
    StatusBarItem statusBarItem = new StatusBarItem
    {
        HorizontalAlignment = alignment,
        Content = content
    };
    StatusBarItemsSource.Add(statusBarItem);
}

Another ViewModel:

TextBlock someTextBlock = new TextBlock { Text = someString };
MainViewModel.AddItemToStatusBar(someTextBlock , System.Windows.HorizontalAlignment.Left);

StatusBar with logo and some Text on the left

Then I found here on stackoverflow the possibility to set a grid as a template How do I customize the WPF StatusBar layout?

So i added this to my code:

<StatusBar ItemsSource="{Binding StatusBarItemsSource}" DockPanel.Dock="Bottom" >
    <StatusBar.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="100" />
                </Grid.ColumnDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </StatusBar.ItemsPanel>
</StatusBar>

How to define the column in XAML is clear

<StatusBarItem Grid.Column="3">
    <TextBlock>some String</TextBlock>
</StatusBarItem>

But how to do this in my view model?

i have tried something like statusBarItem.Grid.Column = 3 / "3" or statusBarItem.Grid.SetColumn but without success

I hope you can help me and this little question has not taken too large extent


Solution

  • Grid.SetColumn was not that bad, but I used it wrong

    That's how it works now:

    StatusBarItem logo = new StatusBarItem
    {
        Content = new Image
        {
            Source = new BitmapImage(new Uri("logo.ico", UriKind.Relative)),
            Width = 16,
            Height = 16
        }
    };
    Grid.SetColumn(logo, 2);
    StatusBarItemsSource.Add(logo);