C# 多语言绑定项资源

C# 多语言绑定项资源,c#,wpf,localization,C#,Wpf,Localization,我想将我的单语言项目更改为多语言项目,因此我使用ResourceDictionary这样做: public class SelectableViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = null) {

我想将我的单语言项目更改为多语言项目,因此我使用ResourceDictionary这样做:

public class SelectableViewModel : INotifyPropertyChanged
{ 
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            if (_isSelected == value) return;
            _isSelected = value;
            OnPropertyChanged();
        }
    }

    private char _code;
    public char Code
    {
        get { return _code; }
        set
        {
            if (_code == value) return;
            _code = value;
            OnPropertyChanged();
        }
    }

    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name == value) return;
            _name = value;
            OnPropertyChanged();
        }
    }

    private string _description;
    public string Description
    {
        get { return _description; }
        set
        {
            if (_description == value) return;
            _description = value;
            OnPropertyChanged();
        }
    }
}
XAML

    <Button Content="{DynamicResource LanguageSetting}" Click="btn_LanguageSetting_Click"/>
这对我来说很好。但是我有一个
ItemsControl

<ItemsControl ItemsSource="{Binding ItemOperate}">
        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type viewmodel:SelectableViewModel}">
                <Border x:Name="Border" Padding="0,8,0,8" BorderThickness="0 0 0 1" BorderBrush="{DynamicResource MaterialDesignDivider}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition SharedSizeGroup="Checkerz" />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <ToggleButton VerticalAlignment="Center" IsChecked="{Binding IsSelected}"
                                      Style="{StaticResource MaterialDesignActionLightToggleButton}"
                                      Content="{Binding Code}" />
                        <StackPanel Margin="8 0 0 0" Grid.Column="7">
                            <TextBlock FontWeight="Bold" Text="{Binding Name}" />
                            <TextBlock Text="{Binding Description}" />
                        </StackPanel>
                    </Grid>
                </Border>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding IsSelected}" Value="True">
                        <Setter TargetName="Border" Property="Background" Value="{DynamicResource MaterialDesignSelection}" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

public主视图模型()
{
_itemOperate=CreateData();
}
私有静态ObservableCollection CreateData()
{
返回新的ObservableCollection
{
新的SelectableViewModel
{
代码='E',
Name=“擦除”,
Description=“逐页擦除MCU芯片”
},
新的SelectableViewModel
{
代码='D',
Name=“检测”,
Description=“检测MCU闪存”,
},
新的SelectableViewModel
{
代码='P',
Name=“编程”,
Description=“通过十六进制文件编程MCU芯片”,
},
新的SelectableViewModel
{
代码='V',
Name=“验证”,
Description=“验证Downing代码”,
},
新的SelectableViewModel
{
Code='L',
Name=“Lock”,
Description=“锁定代码以保护MCU”,
}
};
}

那么我应该如何将其转换为多种语言呢?

首先,我建议您更改本地化引擎。 有很多不同的方法。 有一个最简单的变体:

此外,此工具将帮助您管理资源文件:

你的问题的答案是: 如果您想本地化您的模型,您应该使用参考资料字典而不是硬编码字符串来创建它。 如果您像前面提到的那样实现本地化引擎,这是非常容易的 文章

{
return new ObservableCollection<SelectableViewModel>
    {
        new SelectableViewModel
        {
            Code = 'E',
            Name = YourResourcesProject.Resources.Erase,
            Description = YourResourcesProject.Resources.EraseTheMCUChipByPage
        },
        new SelectableViewModel
        {
            Code = 'D',
            Name = YourResourcesProject.Resources.Detect,
            Description = YourResourcesProject.Resources.DetectTheMCUFlash
        },
        new SelectableViewModel
        {
            Code = 'P',
            Name = YourResourcesProject.Resources.Programming,
            Description = YourResourcesProject.Resources.ProgrammingTheMCUChipByHexFile
        },
        new SelectableViewModel
        {
            Code = 'V',
            Name = YourResourcesProject.Resources.Verify,
            Description = YourResourcesProject.Resources.VerifyTheDowningCode
        },
        new SelectableViewModel
        {
            Code ='L',
            Name = YourResourcesProject.Resources.Lock,
            Description = YourResourcesProject.Resources.LockTheCodeToProtectTheMCU
        }
    };
{
返回新的ObservableCollection
{
新的SelectableViewModel
{
代码='E',
Name=YourResourcesProject.Resources.Erase,
Description=您的资源project.Resources.EraseTheMCUChipByPage
},
新的SelectableViewModel
{
代码='D',
Name=YourResourcesProject.Resources.Detect,
Description=YourResourcesProject.Resources.DetectTheMCUFlash
},
新的SelectableViewModel
{
代码='P',
Name=YourResourcesProject.Resources.Programming,
Description=yoursourcesproject.Resources.ProgrammingTheMCUChipByHexFile
},
新的SelectableViewModel
{
代码='V',
Name=YourResourcesProject.Resources.Verify,
Description=您的资源project.Resources.verifythedowning代码
},
新的SelectableViewModel
{
Code='L',
Name=YourResourcesProject.Resources.Lock,
Description=您的资源project.Resources.lock密码保护CU
}
};

}首先,我建议您更改本地化引擎。 有很多不同的方法。 有一个最简单的变体:

此外,此工具将帮助您管理资源文件:

你的问题的答案是: 如果您想本地化您的模型,您应该使用参考资料字典而不是硬编码字符串来创建它。 如果您像前面提到的那样实现本地化引擎,这是非常容易的 文章

{
return new ObservableCollection<SelectableViewModel>
    {
        new SelectableViewModel
        {
            Code = 'E',
            Name = YourResourcesProject.Resources.Erase,
            Description = YourResourcesProject.Resources.EraseTheMCUChipByPage
        },
        new SelectableViewModel
        {
            Code = 'D',
            Name = YourResourcesProject.Resources.Detect,
            Description = YourResourcesProject.Resources.DetectTheMCUFlash
        },
        new SelectableViewModel
        {
            Code = 'P',
            Name = YourResourcesProject.Resources.Programming,
            Description = YourResourcesProject.Resources.ProgrammingTheMCUChipByHexFile
        },
        new SelectableViewModel
        {
            Code = 'V',
            Name = YourResourcesProject.Resources.Verify,
            Description = YourResourcesProject.Resources.VerifyTheDowningCode
        },
        new SelectableViewModel
        {
            Code ='L',
            Name = YourResourcesProject.Resources.Lock,
            Description = YourResourcesProject.Resources.LockTheCodeToProtectTheMCU
        }
    };
{
返回新的ObservableCollection
{
新的SelectableViewModel
{
代码='E',
Name=YourResourcesProject.Resources.Erase,
Description=您的资源project.Resources.EraseTheMCUChipByPage
},
新的SelectableViewModel
{
代码='D',
Name=YourResourcesProject.Resources.Detect,
Description=YourResourcesProject.Resources.DetectTheMCUFlash
},
新的SelectableViewModel
{
代码='P',
Name=YourResourcesProject.Resources.Programming,
Description=yoursourcesproject.Resources.ProgrammingTheMCUChipByHexFile
},
新的SelectableViewModel
{
代码='V',
Name=YourResourcesProject.Resources.Verify,
Description=您的资源project.Resources.verifythedowning代码
},
新的SelectableViewModel
{
Code='L',
Name=YourResourcesProject.Resources.Lock,
Description=您的资源project.Resources.lock密码保护CU
}
};

}

不要更改任何内容…将您的SelectableViewModel集合转换为XML并更改CreateData以将其加载到本地化版本-您可以为每种语言创建一个文件,也可以将其混合在一起

不要更改任何内容…将您的SelectableViewModel集合转换为XML并更改CreateData以将其加载到本地化版本中本地化版本-您可以为每种语言创建一个文件,也可以将所有代码混合在一起

20行……如您所愿-最明确的是:-(

公共类可选(视图)模型
{
[XmlAttribute]
公共字符串代码{get;set;}
[XmlAttribute]
公共字符串名称{get;set;}
[XmlAttribute]
公共字符串说明{get;set;}
}
///可以直接反序列化视图模型
私有ObservableCollection CreateData()
{
返回新的ObservableCollection(反序列化(文件名、代码、SelectableViewModel));
}
//或者参加一个模型课
私有ObservableCollection CreateData()
{
返回新的ObservableCollection(反序列化(文件名、代码、SelectableModel);
}
静态公共对象
{
return new ObservableCollection<SelectableViewModel>
    {
        new SelectableViewModel
        {
            Code = 'E',
            Name = YourResourcesProject.Resources.Erase,
            Description = YourResourcesProject.Resources.EraseTheMCUChipByPage
        },
        new SelectableViewModel
        {
            Code = 'D',
            Name = YourResourcesProject.Resources.Detect,
            Description = YourResourcesProject.Resources.DetectTheMCUFlash
        },
        new SelectableViewModel
        {
            Code = 'P',
            Name = YourResourcesProject.Resources.Programming,
            Description = YourResourcesProject.Resources.ProgrammingTheMCUChipByHexFile
        },
        new SelectableViewModel
        {
            Code = 'V',
            Name = YourResourcesProject.Resources.Verify,
            Description = YourResourcesProject.Resources.VerifyTheDowningCode
        },
        new SelectableViewModel
        {
            Code ='L',
            Name = YourResourcesProject.Resources.Lock,
            Description = YourResourcesProject.Resources.LockTheCodeToProtectTheMCU
        }
    };
   public class Selectable(View)Model
    {

    [XmlAttribute]
    public string Code { get; set; }

    [XmlAttribute]
    public string Name { get; set; }

    [XmlAttribute]
    public string Description { get; set; }
}

///you can deserialize your view model directly
private ObservableCollection<SelectableViewModel> CreateData()
{
   return new ObservableCollection<SelectableViewModel>( Deserialize( file_name_code_lang.xml, SelectableViewModel) );
}

//    or going through a model class
private ObservableCollection<SelectableViewModel> CreateData()
    {
       return new ObservableCollection<SelectableViewModel>( Deserialize( file_name_code_lang.xml, SelectableModel ).Foreach(p=> new SelectableViewModel(p) );
    }

static public object Deserialize(string filePath, Type objType)
    {
        object objToDeserialize = null;

        XmlTextReader xmlReader = null;
        XmlSerializer xmls = null;

        try
        {
            xmlReader = new XmlTextReader(filePath);
            xmls = new XmlSerializer(objType);

            objToDeserialize = xmls.Deserialize(xmlReader);
        }
        catch (Exception err)
        {
            BusinessLogger.Manage(err);
            return null;
        }
        finally
        {
            xmls = null;
            xmlReader.Close();
        }

        return objToDeserialize;
    }